【BZOJ】3224: Tyvj 1728 普通平衡树
【题意】
1. 插入x数
2. 删除x数(若有多个相同的数,因只删除一个)
3. 查询x数的排名(若有多个相同的数,因输出最小的排名)
4. 查询排名为x的数
5. 求x的前驱(前驱定义为小于x,且最大的数)
6. 求x的后继(后继定义为大于x,且最小的数)
【算法】平衡树(treap)
重要的细节以注释的形式标注在代码中。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=100010; struct tree{int l,r,sz,rnd,num;}t[maxn*2]; int n,sz,root; void up(int k){t[k].sz=1+t[t[k].l].sz+t[t[k].r].sz;} void lturn(int &k){int o=t[k].r;t[k].r=t[o].l;t[o].l=k;up(k);up(o);k=o; } void rturn(int &k){int o=t[k].l;t[k].l=t[o].r;t[o].r=k;up(k);up(o);k=o; } void ins(int &k,int x){if(!k){k=++sz;t[k].rnd=rand();t[k].num=x;t[k].sz=1;return;}//returnt[k].sz++;if(x<=t[k].num){ins(t[k].l,x);if(t[t[k].l].rnd<t[k].rnd)rturn(k);//turn }else{ins(t[k].r,x);if(t[t[k].r].rnd<t[k].rnd)lturn(k);} } void del(int &k,int x){//t[k].sz--;if(t[k].num==x){if(t[k].l*t[k].r==0){k=t[k].l+t[k].r;return;}if(t[t[k].l].rnd<t[t[k].r].rnd){rturn(k);t[k].sz--;del(t[k].r,x);}else{lturn(k);t[k].sz--;del(t[k].l,x);}}else if(x<t[k].num)t[k].sz--,del(t[k].l,x);else t[k].sz--,del(t[k].r,x); } int find(int k,int x){if(!k)return 0;//!kif(x<=t[k].num)return find(t[k].l,x);else return t[t[k].l].sz+1+find(t[k].r,x); } int rank(int k,int x){if(t[t[k].l].sz+1==x)return t[k].num;if(x<t[t[k].l].sz+1)return rank(t[k].l,x);else return rank(t[k].r,x-t[t[k].l].sz-1); } int pre(int k,int x){if(!k)return -1;if(t[k].num<x)return max(t[k].num,pre(t[k].r,x));else return pre(t[k].l,x); } int suc(int k,int x){if(!k)return 0x3f3f3f3f;if(t[k].num>x)return min(t[k].num,suc(t[k].l,x));else return suc(t[k].r,x); } int main(){srand(233);//srand!!!!!!!!!!scanf("%d",&n);sz=root=0;for(int i=1;i<=n;i++){int opt,x;scanf("%d%d",&opt,&x);if(opt==1)ins(root,x);if(opt==2)del(root,x);if(opt==3)printf("%d\n",find(root,x)+1);//+1if(opt==4)printf("%d\n",rank(root,x));if(opt==5)printf("%d\n",pre(root,x));if(opt==6)printf("%d\n",suc(root,x));}return 0; }
View Code
转载于:https://www.cnblogs.com/onioncyc/p/7890314.html
【BZOJ】3224: Tyvj 1728 普通平衡树相关推荐
- BZOJ 3224: Tyvj 1728 普通平衡树【Treap】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 9629 Solved: 4091 [Submit][S ...
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
Treap树堆:一种排序二叉树(中序遍历权值有序) 每个节点有两个关键字:key[]和rand[] 其中key[]满足二叉搜索树性质,rand[]满足堆性质(即Tree+Heap=Treap)即 如果 ...
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
平衡树的入门题目,也可以用Treap来实现,我觉得Treap的核心就是那个rand()了用来保证树不退化成链,同时还是有平衡树的特性..总体来说我觉得比较好些,而且比较快 #include <c ...
- bzoj:3224: Tyvj 1728 普通平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相 ...
- bzoj 3224 Tyvj 1728 普通平衡树
题目大意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输 ...
- 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 14480 Solved: 6275 Descripti ...
- bzoj3224: Tyvj 1728 普通平衡树(splay)
3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: 1 #include<cstdio> 2 #include<cstring& ...
最新文章
- 阿里云双12服务器和阿里云双12数据库活动又开始了
- bootstrap解析-栅格系统
- ViewStub must have a valid layoutResource
- VS 2008 .NET Framework 3.5 Training Kit
- Linux环境下安装Redis
- reorder-list
- oracle财务软件凭证打印,金算盘财务软件后台数据库为Oracle
- php 清空一个数组_PHP工程师学Python数据类型
- java编程_Java编程和C语言的比较
- php 生成随机数组,利用php如何获取随机数组列表
- docker-hub改版之后死活无法生成删除镜像的解决方法
- 【测试沉思录】5. 测试人员如何快速熟悉新业务?
- 数据资料网站_更新......
- latex下载安装记录
- redis持久化(persistent)
- 五、数组(高琪java300集+java从入门到精通笔记)
- PNG alpha transparency: AlphaImageLoader filter flaws
- OpenAtom XuperChain开发者夏季论坛落幕,多位行业大咖共话开源区块链前景
- 带得动ps和python的笔记本_求一性价比高,轻薄,运行速度快,带得动ps,pr等软件的笔记本推荐...
- C# WinRar 解压缩