bzoj1503 [NOI2004]郁闷的出纳员(splay)
来源:互联网 发布:java数字图像处理 pdf 编辑:程序博客网 时间:2024/05/22 16:32
其实挺简单的一道平衡树板子题。。。奈何调了两天。。。在wrx 大佬的帮助下终于调出了程序。。。并发现了自己一直以来的一个错误认识。在insert的时候,必须把p的sz也更新对。因为p可能是root,就不会splay,也就不会更新,也就会是错的。%%%wrx
#include <bits/stdc++.h>using namespace std;#define ll long long#define inf 0x3f3f3f3f#define N 100010inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar(); return x*f;}int n,mn,fa[N],c[N][2],sz[N],num[N],delta=0,ans=0,owo=0,a[N],rt=0,succd=0;inline void update(int p){sz[p]=sz[c[p][0]]+sz[c[p][1]]+num[p];}inline void rotate(int x,int &k){ int y=fa[x],z=fa[y],l=x==c[y][1],r=l^1; if(y!=k) c[z][c[z][1]==y]=x; else k=x; fa[x]=z;fa[y]=x;fa[c[x][r]]=y; c[y][l]=c[x][r];c[x][r]=y;update(y);update(x); }inline void splay(int x,int &k){ while(x!=k){ int y=fa[x],z=fa[y]; if(y!=k){ if(x==c[y][1]^y==c[z][1]) rotate(x,k); else rotate(y,k); }rotate(x,k); }}inline void insert1(int &p,int x,int f){ if(!p){p=++owo;a[p]=x;c[p][0]=c[p][1]=0;fa[p]=f;sz[p]=num[p]=1;splay(p,rt);return;} if(a[p]==x){num[p]++;sz[p]++;splay(p,rt);return;}//如果p==root,不会splay,就不会更新,就会错x所以一定要sz[p]++ if(x<a[p]) insert1(c[p][0],x,p); else insert1(c[p][1],x,p);}inline void succ(int p,int x){ if(!p) return; if(a[p]>=x){succd=p;succ(c[p][0],x);} else succ(c[p][1],x);}inline void del1(int xx){ succd=0;succ(rt,xx);int x=succd; if(!x){ans+=sz[rt];rt=0;return;}splay(x,rt); ans+=sz[c[x][0]];fa[c[x][0]]=0;c[x][0]=0;update(x);}inline int find(int p,int x){ if(x<=sz[c[p][0]]) return find(c[p][0],x); x-=sz[c[p][0]];if(x<=num[p]) return a[p]; return find(c[p][1],x-num[p]);}int main(){// freopen("a.in","r",stdin); n=read();mn=read(); for(int i=1;i<=n;++i){ char op[5];scanf("%s",op+1);int x=read(); if(op[1]=='I'){ if(x<mn) continue;insert1(rt,x-delta,0); }if(op[1]=='A') delta+=x; if(op[1]=='S'){delta+=-x;del1(mn-delta);} if(op[1]=='F'){ if(sz[rt]<x) puts("-1"); else printf("%d\n",find(rt,sz[rt]-x+1)+delta); } }printf("%d\n",ans); return 0;}
阅读全文
0 0
- bzoj1503 [NOI2004]郁闷的出纳员(splay)
- [BZOJ1503]NOI2004 郁闷的出纳员|splay
- 【bzoj1503】[NOI2004]郁闷的出纳员 Splay
- 【BZOJ1503】[NOI2004]郁闷的出纳员【Splay】
- bzoj1503 [NOI2004]郁闷的出纳员 splay
- [BZOJ1503][NOI2004]郁闷的出纳员(平衡树splay)
- [BZOJ1503][NOI2004]郁闷的出纳员(平衡树splay)
- 【Splay|Treap】poj3580 SuperMemo && bzoj1503 [noi2004]郁闷的出纳员
- [bzoj1503][NOI2004]郁闷的出纳员
- BZOJ1503【NOI2004】郁闷的出纳员
- [BZOJ1503][NOI2004]郁闷的出纳员
- bzoj1503【NOI2004】郁闷的出纳员
- [BZOJ1503] [NOI2004]郁闷的出纳员
- 【bzoj1503】[NOI2004]郁闷的出纳员
- 【BZOJ1503】[NOI2004]郁闷的出纳员
- bzoj1503: [NOI2004]郁闷的出纳员
- BZOJ1503: [NOI2004]郁闷的出纳员
- 【bzoj1503】[NOI2004]郁闷的出纳员
- 08-CSS的定位
- 期末考试 编程题#8:计算整数k(Coursera 程序设计与算法 专项课程3 C++程序设计 郭炜、刘家瑛;进制转换)
- openlayer 图形交互编辑
- HTTP协议
- 如何从官网下载Hibernate源码与jar包2017.12.05(包含历史版本)
- bzoj1503 [NOI2004]郁闷的出纳员(splay)
- 闭包,装饰器
- oracle安装 新手教程
- 一分钟了解“英语表示区分”
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 线段的裁剪算法
- freemaker简介
- 【转载】Pip in IronPython 2.7.5