treap 1286郁闷的出纳员.cpp
2016-01-14 17:17
405 查看
#include<cstdio>
#include<cstdlib>
#include<ctime>
struct shu
{
int l,r,sum,zhi,dui;
}a[100005];
int n,xia,root,size,lei,leave;
char ch[2];
void you(int &a1)
{
int t=a[a1].l;
a[a1].l=a[t].r;
a[t].r=a1;
a[t].sum=a[a1].sum;
a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
a1=t;
return;
}
void zuo(int &a1)
{
int t=a[a1].r;
a[a1].r=a[t].l;
a[t].l=a1;
a[t].sum=a[a1].sum;
a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
a1=t;
return;
}
void jia(int &a1,int a2)
{
if(a1==0)
{
size++;
a1=size;
a[a1].sum=1;
a[a1].zhi=a2;
a[a1].dui=rand();
return;
}
a[a1].sum++;
if(a2<a[a1].zhi)
{
jia(a[a1].l,a2);
if(a[a[a1].l].dui<a[a1].dui)
you(a1);
}
else
{
jia(a[a1].r,a2);
if(a[a[a1].r].dui<a[a1].dui)
zuo(a1);
}
return;
}
int shan(int &a1,int a2)
{
if(a1==0)
return 0;
int t;
if(a[a1].zhi<a2)
{
t=a[a[a1].l].sum+1;
a1=a[a1].r;
return t+shan(a1,a2);
}
t=shan(a[a1].l,a2);
a[a1].sum-=t;
return t;
}
int zhao(int a1,int a2)
{
if(a[a[a1].r].sum+1==a2)
return a[a1].zhi;
if(a[a[a1].r].sum>=a2)
return zhao(a[a1].r,a2);
else
return zhao(a[a1].l,a2-a[a[a1].r].sum-1);
}
int main()
{
root=size=0;
srand(time(0));
scanf("%d%d",&n,&xia);
for(int i=0;i<n;i++)
{
int a1;
scanf("%s%d",ch,&a1);
if(ch[0]=='I')
if(a1>=xia)
jia(root,a1-lei);
if(ch[0]=='A')
lei+=a1;
if(ch[0]=='S')
{
lei-=a1;
leave+=shan(root,xia-lei);
}
if(ch[0]=='F')
{
if(a1>a[root].sum)
printf("-1\n");
else
printf("%d\n",zhao(root,a1)+lei);
}
}
printf("%d\n",leave);
return 0;
}
#include<cstdlib>
#include<ctime>
struct shu
{
int l,r,sum,zhi,dui;
}a[100005];
int n,xia,root,size,lei,leave;
char ch[2];
void you(int &a1)
{
int t=a[a1].l;
a[a1].l=a[t].r;
a[t].r=a1;
a[t].sum=a[a1].sum;
a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
a1=t;
return;
}
void zuo(int &a1)
{
int t=a[a1].r;
a[a1].r=a[t].l;
a[t].l=a1;
a[t].sum=a[a1].sum;
a[a1].sum=a[a[a1].l].sum+a[a[a1].r].sum+1;
a1=t;
return;
}
void jia(int &a1,int a2)
{
if(a1==0)
{
size++;
a1=size;
a[a1].sum=1;
a[a1].zhi=a2;
a[a1].dui=rand();
return;
}
a[a1].sum++;
if(a2<a[a1].zhi)
{
jia(a[a1].l,a2);
if(a[a[a1].l].dui<a[a1].dui)
you(a1);
}
else
{
jia(a[a1].r,a2);
if(a[a[a1].r].dui<a[a1].dui)
zuo(a1);
}
return;
}
int shan(int &a1,int a2)
{
if(a1==0)
return 0;
int t;
if(a[a1].zhi<a2)
{
t=a[a[a1].l].sum+1;
a1=a[a1].r;
return t+shan(a1,a2);
}
t=shan(a[a1].l,a2);
a[a1].sum-=t;
return t;
}
int zhao(int a1,int a2)
{
if(a[a[a1].r].sum+1==a2)
return a[a1].zhi;
if(a[a[a1].r].sum>=a2)
return zhao(a[a1].r,a2);
else
return zhao(a[a1].l,a2-a[a[a1].r].sum-1);
}
int main()
{
root=size=0;
srand(time(0));
scanf("%d%d",&n,&xia);
for(int i=0;i<n;i++)
{
int a1;
scanf("%s%d",ch,&a1);
if(ch[0]=='I')
if(a1>=xia)
jia(root,a1-lei);
if(ch[0]=='A')
lei+=a1;
if(ch[0]=='S')
{
lei-=a1;
leave+=shan(root,xia-lei);
}
if(ch[0]=='F')
{
if(a1>a[root].sum)
printf("-1\n");
else
printf("%d\n",zhao(root,a1)+lei);
}
}
printf("%d\n",leave);
return 0;
}
相关文章推荐
- C++引用
- 关于C++中用两个迭代器方式初始化string的知识
- C++调用java的过程
- C/C++动态分配与释放内存的区别详细解析
- Google C++ 编程规范 笔记
- 【C语言】有一个字符数组的内容为:"student a am i",请你将数组的内容改为"i am a student".
- 并查集_POJ 1182_食物链
- c/c++宏定义的基本用法
- 讲解C++编程中Address-of运算符&的作用及用法
- c语言实现动态指针数组Dynamic arrays
- C语言练习代码
- C语言技巧
- C语言 随机数
- 详解C++编程中的sizeof运算符与typeid运算符
- C语言system命令
- C语言模拟C++类
- C++中关于[]静态数组和new分配的动态数组的区别分析
- C++ using namespace std 用法深入解析
- 详解C++中二进制求补运算符与下标运算符的用法
- C Programming Chapter2