codevs1286 郁闷的出纳员
来源:互联网 发布:淘宝的地址怎么填 编辑:程序博客网 时间:2024/05/08 12:46
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define lchild rt<<1,l,m #define rchild rt<<1|1,m+1,r using namespace std; struct sbt { int left,right,size,data; }tree[200001]; int sum; int n,minn; string ch; int now; int key; int root,top; void left_rot(int &x) { int y=tree[x].right; tree[x].right=tree[y].left; tree[y].left=x; tree[y].size=tree[x].size; tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1; x=y; } void right_rot(int &x) { int y=tree[x].left; tree[x].left=tree[y].right; tree[y].right=x; tree[y].size=tree[x].size; tree[x].size=tree[tree[x].left].size+tree[tree[x].right].size+1; x=y; } void maintain(int &x,bool flag) { if (!flag) { if (tree[tree[tree[x].left].left].size>tree[tree[x].right].size) right_rot(x); else if (tree[tree[tree[x].left].right].size>tree[tree[x].right].size) left_rot(tree[x].left),right_rot(x); else return; } else { if (tree[tree[tree[x].right].right].size>tree[tree[x].left].size) left_rot(x); else if (tree[tree[tree[x].right].left].size>tree[tree[x].left].size) right_rot(tree[x].right),left_rot(x); else return; } maintain(tree[x].left,0); maintain(tree[x].right,1); maintain(x,1); maintain(x,0); } void insert(int &x,int data) { if (x==0) { x=++top; tree[x].left=tree[x].right=0; tree[x].size=1; tree[x].data=data; } else { tree[x].size++; if (data<tree[x].data) insert(tree[x].left,data); else insert(tree[x].right,data); maintain(x,data>=tree[x].data); } } int remove(int &x,int data) { tree[x].size--; if (tree[x].data>data) remove(tree[x].left,data); else if (tree[x].data<data) remove(tree[x].right,data); else { if (tree[x].left!=0&&tree[x].right==0) { int ret=x; x=tree[x].left; return ret; } else if (tree[x].left==0&&tree[x].right!=0) { int ret=x; x=tree[x].right; return ret; } else if (tree[x].left==0&&tree[x].right==0) { int ret=x; x=0; return ret; } else if (tree[x].left!=0&&tree[x].right!=0) { int ret=tree[x].right; while (tree[ret].left) ret=tree[ret].left; tree[x].data=tree[ret].data; remove(tree[x].right,tree[ret].data); } } } int select(int &x,int k) { int r=tree[tree[x].left].size+1; if (r==k) return tree[x].data; else if (r<k) return select(tree[x].right,k-r); else if (r>k) return select(tree[x].left,k); } int getmin() { int x; for (x=root;tree[x].left;x=tree[x].left); return tree[x].data; } int main() { ("cashier.in","r",stdin); ("cashier.out","w",stdout); scanf("%d%d",&n,&minn); for (int i=1;i<=n;i++) { cin>>ch; scanf("%d",&key); if (now) while (getmin()<minn) { remove(root,getmin()); sum++; now--; } if (ch=="I") { if (key>=minn) insert(root,key),now++; } else if (ch=="A") for (int j=1;j<=top;j++) tree[j].data+=key; else if (ch=="S") for (int j=1;j<=top;j++) tree[j].data-=key; else if (ch=="F") { if (key>now) { printf("-1\n"); continue; } else printf("%d\n",select(root,now-key+1)); } } cout<<sum; }
0 0
- codevs1286 郁闷的出纳员
- 【NOI2004】郁闷的出纳员Codevs1286
- 【codevs1286】【BZOJ1503】郁闷的出纳员,splay练习
- [伸展树]codevs1286 郁闷的出纳员
- noi2004 郁闷的出纳员
- [NOI2004]郁闷的出纳员
- NOI04郁闷的出纳员
- NOI2004 郁闷的出纳员
- NOI2004 郁闷的出纳员
- NOI2004 郁闷的出纳员
- NOI2004 - 郁闷的出纳员
- NOI2004 郁闷的出纳员
- bzoj1503 郁闷的出纳员
- NOI2004郁闷的出纳员
- 【NOI2004】郁闷的出纳员
- [NOI2004]郁闷的出纳员
- [NOI2004]郁闷的出纳员
- 郁闷的出纳员 ( splay )
- HTML5学习之路(二)-地理定位
- 查找与排序 In Java
- python中关于时间time模块的知识
- 一个客户端配置多个Git账户
- Reveal---iOS上的屠龙刀
- codevs1286 郁闷的出纳员
- 快速排序
- linux达人养成计划I
- win7命令行静默安装SQLServer2008R2脚本
- ServletContext
- PC键盘在Mac下Command/Option键切换
- 关于“Ubuntu开发者创新大赛”正式开启的公告
- C语言的一些算法
- 关于时区AS3