记录编号 |
283692 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2004]郁闷的出纳员 |
最终得分 |
100 |
用户昵称 |
安呐一条小咸鱼。 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.089 s |
提交时间 |
2016-07-15 10:49:15 |
内存使用 |
1.84 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=100001;
int lower;//最低工资;
int add_pay=0;
int c_num=0;
int front=0;
struct Node
{
int key,size,llink,rlink;
}number[maxn];
void LeftRotate(int &x)//左旋
{
int y=number[x].rlink;
if(y==0)return;
number[x].rlink=number[y].llink;
number[y].llink=x;
number[y].size=number[x].size;
number[x].size=number[number[x].llink].size+number[number[x].rlink].size+1;
x=y;
}
void RightRotate(int &x)//右旋
{
int y=number[x].llink;
if(y==0)return;
number[x].llink=number[y].rlink;
number[y].rlink=x;
number[y].size=number[x].size;
number[x].size=number[number[x].llink].size+number[number[x].rlink].size+1;
x=y;
}
void Maintain(int &root,bool flag)//维护SBT树
{
if(!root)return;
if(flag)
{
if(number[root].llink&&number[number[root].llink].llink&&
(!number[root].rlink||number[number[number[root].llink].llink].size>number[number[root].rlink].size))
{
RightRotate(root);
}
else if(number[root].llink&&number[number[root].llink].rlink&&
(!number[root].rlink||number[number[number[root].llink].rlink].size>number[number[root].rlink].size))
{
LeftRotate(number[root].llink);
RightRotate(root);
}
else return;
}
else
{
if(number[root].rlink&&number[number[root].rlink].rlink&&
(!number[root].llink||number[number[number[root].rlink].rlink].size>number[number[root].llink].size))
{
LeftRotate(root);
}
else if(number[root].rlink&&number[number[root].rlink].llink&&
(!number[root].llink||number[number[number[root].rlink].llink].size>number[number[root].llink].size))
{
RightRotate(number[root].rlink);
LeftRotate(root);
}
else return;
}
Maintain(number[root].llink,true);
Maintain(number[root].rlink,false);
Maintain(root,true);
Maintain(root,false);
}
int Delete(int &root)
{
int t=0,sum=0;
if(!root)return root;
if(number[root].key+add_pay<lower)
{
sum+=number[number[root].llink].size+1;
number[root].size-=sum;
number[root].llink=0;
t=Delete(number[root].rlink);
sum+=t;
number[root].size-=t;
number[number[root].rlink].size=number[root].size;
root=number[root].rlink;
}
else
{
t=Delete(number[root].llink);
sum=t;
number[root].size-=t;
}
return sum;
}
void Insert(int &root,int x)
{
if(!root)
{
root=++front;
number[root].key=x;
number[root].size=1;
}
else
{
number[root].size++;
Insert(x<=number[root].key?number[root].llink:number[root].rlink,x);
Maintain(root,x<=number[root].key);
}
}
int Select(int R,int x)//返回第x大的元素
{
if(number[R].rlink==0)
{
number[number[R].rlink].size=0;
}
int r=number[number[R].rlink].size+1;
if(x<r)return Select(number[R].rlink,x);
else
{
if(x>r)
{
return Select(number[R].llink,x-r);
}
if(x==r)
{
return number[R].key;
}
}
}
int main()
{
freopen("cashier.in","r",stdin);
freopen("cashier.out","w",stdout);
int N;
char command;
int pay,root=0;
int i;
cin>>N>>lower;
for(i=1;i<=N;i++)
{
cin>>command>>pay;
if(command=='I')
{
if(pay>=lower)
{
Insert(root,pay-add_pay);
}
}
if(command=='F')
{
if(pay>number[root].size)
{
cout<<-1<<endl;
}
else
{
cout<<Select(root,pay)+add_pay<<endl;
}
}
if(command=='A')
{
add_pay+=pay;
}
if(command=='S')
{
add_pay-=pay;
c_num+=Delete(root);
}
}
cout<<c_num<<endl;
return 0;
}