(treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
2017-07-30 13:28
441 查看
Description
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
Input
第一行为n,表示操作的个数,下面n行每行有两个数opt和x,opt表示操作的序号(1<=opt<=6)Output
对于操作3,4,5,6每行输出一个数,表示对应答案Sample Input
101 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
10646584185
492737
HINT
1.n的数据范围:n<=1000002.每个数的数据范围:[-2e9,2e9]
Source
平衡树STL用法练手题。。。(手动滑稽)
这数据我给满分
(感谢hzwer...)
// It is made by XZZ #include<cstdio> using namespace std; #define rep(a,b,c) for(rg int a=b;a<=c;a++) #define drep(a,b,c) for(rg int a=b;a>=c;a--) #define erep(a,b) for(rg int a=fir;a;a=nxt[a]) #define il inline #define rg register #define vd void #define Ls tree[now].ls #define Rs tree[now].rs typedef long long ll; il int gi(){ rg int x=0,f=1;rg char ch=getchar(); while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar(); while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*f; } struct node{ int ls,rs,value,rand,sum,size; node(){ls=rs=value=rand=sum=size=0;} }tree[100001]; int root=0,siz=0; ll seed=19260817; il int Rand(){return seed=seed*48271LL%2147483647;} il vd reset(int now){ tree[now].size=tree[Ls].size+tree[Rs].size+tree[now].sum; } il vd lrot(int&now){ int ls=tree[now].ls; tree[now].ls=tree[ls].rs,tree[ls].rs=now; tree[ls].size=tree[now].size;reset(now);now=ls; } il vd rrot(int&now){ int rs=tree[now].rs; tree[now].rs=tree[rs].ls,tree[rs].ls=now; tree[rs].size=tree[now].size;reset(now);now=rs; } il vd ins(int&now,int num){ if(now==0){ ++siz,now=siz,tree[now].size=tree[now].sum=1,tree[now].value=num,tree[now].rand=Rand(); return; } ++tree[now].size; if(tree[now].value==num)++tree[now].sum; else if(num<tree[now].value){ ins(Ls,num); if(tree[Ls].rand<tree[now].rand)lrot(now); }else{ ins(Rs,num); if(tree[Rs].rand<tree[now].rand)rrot(now); } } il vd del(int&now,int num){ if(now==0)return; if(tree[now].value==num){ if(tree[now].sum>1){--tree[now].sum,--tree[now].size;return;} if(!Ls||!Rs)now=Ls|Rs; else if(tree[Ls].rand<tree[Rs].rand)lrot(now),del(now,num); else rrot(now),del(now,num); return; } --tree[now].size; if(num<tree[now].value)del(Ls,num); else del(Rs,num); } il int getrank(int now,int num){ int Rank=0; while(now)if(tree[now].value==num)return tree[Ls].size+1+Rank; else if(num>tree[now].value)Rank+=tree[Ls].size+tree[now].sum,now=Rs; else now=Ls; } il int getnum(int now,int num){ while(1) if(num<=tree[Ls].size)now=Ls; else if(num>tree[Ls].size+tree[now].sum)num-=tree[Ls].size+tree[now].sum,now=Rs; else return tree[now].value; } il int lower(int now,int num){ int ret; while(now)if(tree[now].value<num)ret=tree[now].value,now=Rs; else now=Ls; return ret; } il int upper(int now,int num){ int ret; while(now)if(tree[now].value>num)ret=tree[now].value,now=Ls; else now=Rs; return ret; } int main(){ freopen("phs.in","r",stdin); freopen("phs.out","w",stdout); int n=gi(),opt,x; while(n--){ opt=gi(),x=gi(); switch(opt){ case 1:ins(root,x);break; case 2:del(root,x);break; case 3:printf("%d\n",getrank(root,x));break; case 4:printf("%d\n",getnum(root,x));break; case 5:printf("%d\n",lower(root,x));break; case 6:printf("%d\n",upper(root,x));break; } } return 0; }
View Code
[b]这样在cogs上可以从1.90s下降到1.70s
在洛谷上可以从164ms上升到259ms(大雾)
在bzoj上可以从300ms下降到296ms
所以非递归到底有没有用???
相关文章推荐
- BZOJ3224 Tyvj 1728 普通平衡树(Treap)
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
- BZOJ 3224 洛谷 3369 【模板】普通平衡树(Treap/SBT)
- bzoj3224 Tyvj 1728 普通平衡树(splay/treap)
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
- 【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- bzoj3224Tyvj 1728 普通平衡树 treap
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- BZOJ-3224 普通平衡树 TYVJ-1728 Treap + Vector
- BZOJ 3224 Tyvj 1728 普通平衡树——treap
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- bzoj3224 Tyvj 1728 普通平衡树 非旋转式Treap
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树 treap
- bzoj3224 Tyvj 1728 普通平衡树 treap
- [BZOJ3224]Tyvj 1728 普通平衡树 && treap
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树 & 非旋转实现