bzoj3224 Tyvj 1728 普通平衡树
2017-09-10 19:34
351 查看
题目
高级数据结构。。。。。模板题,用平衡树解决。
不太会指针,只好用数组模拟。
存个模板吧。
高级数据结构。。。。。模板题,用平衡树解决。
不太会指针,只好用数组模拟。
存个模板吧。
#include<bits/stdc++.h> #define N 1000000 using namespace std; int n,opt,x; int f[N+1],ch[N+1][2],key[N+1],cnt[N+1],siz[N+1],sz,rt; inline char nc() { static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++; } inline int read() { int x=0,f=1; char c=nc(); while((c<'0'||c>'9')&&c!='-')c=nc(); if(c=='-')f=-1,c=nc(); while(c<='9'&&c>='0')x=x*10+c-'0',c=nc(); return x*f; } inline void clear(int x) { ch[x][0]=ch[x][1]=f[x]=key[x]=cnt[x]=siz[x]=0; } inline int get(int x) { return ch[f[x]][1]==x; } inline void update(int x) { if(!x)return; siz[x]=cnt[x]; if(ch[x][0])siz[x]+=siz[ch[x][0]]; if(ch[x][1])siz[x]+=siz[ch[x][1]]; } inline void rotate(int x) { int old=f[x],oldf=f[old],which=get(x); ch[old][which]=ch[x][which^1];f[ch[old][which]]=old; f[old]=x,ch[x][which^1]=old; f[x]=oldf; if(oldf)ch[oldf][ch[oldf][1]==old]=x; update(old),update(x); } inline void splay(int x) { for(int fa;fa=f[x];rotate(x)) if(f[fa])rotate((get(x)==get(fa))?fa:x); rt=x; } inline void insert(int x) { if(rt==0){sz++,clear(sz),key[sz]=x,cnt[sz]=1,siz[sz]=1,rt=sz;return;} int now=rt,fa=0; while(true) { if(key[now]==x) { cnt[now]++; update(now),update(fa); splay(now); break; } fa=now; now=ch[now][key[now]<x]; if(!now) { sz++; clear(sz); key[sz]=x,cnt[sz]=1,siz[sz]=1; f[sz]=fa;ch[fa][key[fa]<x]=sz; update(fa); splay(sz); break; } } } inline int find(int x) { int ans=0,now=rt; while(true) { if(x<key[now])now=ch[now][0]; else { ans+=(ch[now][0]?siz[ch[now][0]]:0); if(x==key[now]){splay(now);return ans+1;} ans+=cnt[now]; now=ch[now][1]; } } } inline int findx(int x) { int now=rt; while(true) { if(ch[now][0]&&x<=siz[ch[now][0]])now=ch[now][0]; else { int tmp=(ch[now][0]?siz[ch[now][0]]:0)+cnt[now]; if(x<=tmp)return key[now]; x-=tmp,now=ch[now][1]; } } } inline int pre() { int now=ch[rt][0]; while (ch[now][1]) now=ch[now][1]; return now; } inline int suf() { int now=ch[rt][1]; while (ch[now][0]) now=ch[now][0]; return now; } inline void del(int x) { int tmp=find(x); if(cnt[rt]>1){cnt[rt]--;update(rt);return;} if(!ch[rt][0]&&!ch[rt][1]){clear(rt);rt=0;return;} if(!ch[rt][0]) { int oldrt=rt; rt=ch[rt][1];f[rt]=0; clear(oldrt); return; } if(!ch[rt][1]) { int oldrt=rt; rt=ch[rt][0];f[rt]=0; clear(oldrt); return; } int oldrt=rt,leftbig=pre(); splay(leftbig); ch[rt][1]=ch[oldrt][1]; f[ch[oldrt][1]]=rt; clear(oldrt); update(rt); } int main() { //freopen("in.txt","r",stdin); n=read(); for(int i=1;i<=n;i++) { opt=read(),x=read(); if(opt==1)insert(x); if(opt==2)del(x); if(opt==3)printf("%d\n",find(x)); if(opt==4)printf("%d\n",findx(x)); if(opt==5)insert(x),printf("%d\n",key[pre()]),del(x); if(opt==6)insert(x),printf("%d\n",key[suf()]),del(x); } return 0; }
相关文章推荐
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- [bzoj3224]Tyvj 1728 普通平衡树——splay模板
- BZOJ 3224:Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树 ( 替罪羊树)
- bzoj3224 Tyvj 1728 普通平衡树(splay/treap)
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
- bzoj 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 Tyvj 1728 普通平衡树 | Splay 板子+SPlay详细讲解
- bzoj 3224: Tyvj 1728 普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树 treap
- 【bzoj 3224】【Tyvj 1728】 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
- BZOJ 3224 TYVJ 1728 普通平衡树
- [BZOJ 3224] [Tyvj 1728] 普通平衡树
- bzoj 3224,tyvj 1728普通平衡树
- [BZOJ3224]Tyvj 1728 普通平衡树