(treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
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
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
Sample Output
84185
492737
HINT
Source
STL用法练手题。。。(手动滑稽)
- // It is made by XZZ
- #include<cstdio>
- #include<algorithm>
- #include<vector>
- 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[b];a;a=nxt[a])
- #define il inline
- #define rg register
- #define vd void
- typedef long long ll;
- il int gi(){
- rg int x=,f=;rg char ch=getchar();
- while(ch<''||ch>'')f=ch=='-'?-:f,ch=getchar();
- while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
- return x*f;
- }
- vector<int>A;
- int main(){
- int n=gi(),opt,x;
- while(n--){
- opt=gi(),x=gi();
- if(opt==)A.insert(upper_bound(A.begin(),A.end(),x),x);
- else if(opt==)A.erase(lower_bound(A.begin(),A.end(),x));
- else if(opt==)printf("%d\n",lower_bound(A.begin(),A.end(),x)-A.begin()+);
- else if(opt==)printf("%d\n",A[x-]);
- else if(opt==)printf("%d\n",*(lower_bound(A.begin(),A.end(),x)-));
- else printf("%d\n",*upper_bound(A.begin(),A.end(),x));
- }
- return ;
- }
(学习treap中,到时候再发)
更新:
液我A了!!!
先上代码
- // 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[b];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=,f=;rg char ch=getchar();
- while(ch<''||ch>'')f=ch=='-'?-:f,ch=getchar();
- while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
- return x*f;
- }
- struct node{
- int ls,rs,value,rand,sum,size;
- node(){ls=rs=value=rand=sum=size=;}
- }tree[];
- int root=,siz=;
- ll seed=;
- il int Rand(){return seed=seed*48271LL%;}
- 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==){
- ++siz,now=siz,tree[now].size=tree[now].sum=,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==)return;
- if(tree[now].value==num){
- if(tree[now].sum>){--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){
- if(now==)return ;
- if(tree[now].value==num)return tree[Ls].size+;
- if(num>tree[now].value)return tree[Ls].size+tree[now].sum+getrank(Rs,num);
- else return getrank(Ls,num);
- }
- il int getnum(int now,int num){
- if(num<=tree[Ls].size)return getnum(Ls,num);
- else if(num>tree[Ls].size+tree[now].sum)return getnum(Rs,num-tree[Ls].size-tree[now].sum);
- else return tree[now].value;
- }
- int ans;
- il vd lower(int now,int num){
- if(now==)return;
- if(tree[now].value<num)ans=now,lower(Rs,num);
- else lower(Ls,num);
- }
- il vd upper(int now,int num){
- if(now==)return;
- if(tree[now].value>num)ans=now,upper(Ls,num);
- else upper(Rs,num);
- }
- int main(){
- int n=gi(),opt,x;
- while(n--){
- opt=gi(),x=gi();
- switch(opt){
- case :ins(root,x);break;
- case :del(root,x);break;
- case :printf("%d\n",getrank(root,x));break;
- case :printf("%d\n",getnum(root,x));break;
- case :ans=,lower(root,x),printf("%d\n",tree[ans].value);break;
- case :ans=,upper(root,x),printf("%d\n",tree[ans].value);break;
- }
- }
- return ;
- }
- // 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[b];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=,f=;rg char ch=getchar();
- while(ch<''||ch>'')f=ch=='-'?-:f,ch=getchar();
- while(ch>=''&&ch<='')x=x*+ch-'',ch=getchar();
- return x*f;
- }
- struct node{
- int ls,rs,value,rand,sum,size;
- node(){ls=rs=value=rand=sum=size=;}
- }tree[];
- int root=,siz=;
- ll seed=;
- il int Rand(){return seed=seed*48271LL%;}
- 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==){
- ++siz,now=siz,tree[now].size=tree[now].sum=,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==)return;
- if(tree[now].value==num){
- if(tree[now].sum>){--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=;
- while(now)if(tree[now].value==num)return tree[Ls].size++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()
- 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 :ins(root,x);break;
- case :del(root,x);break;
- case :printf("%d\n",getrank(root,x));break;
- case :printf("%d\n",getnum(root,x));break;
- case :printf("%d\n",lower(root,x));break;
- case :printf("%d\n",upper(root,x));break;
- }
- }
- return ;
- }
这样在cogs上可以从1.90s下降到1.70s
在洛谷上可以从164ms上升到259ms(大雾)
在bzoj上可以从300ms下降到296ms
所以非递归到底有没有用???
(treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树的更多相关文章
- 【替罪羊树】bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树
[替罪羊树]bzoj3224&luogu3369&cogs1829 [Tyvj 1728]普通平衡树 bzoj 洛谷 cogs 先长点芝士 替罪羊树也是一种很好写的平衡树qwq..替罪 ...
- BZOJ3224 洛谷3369 Tyvj 1728 普通平衡树 splay
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3224 题意概括 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. ...
- BZOJ 3224: Tyvj 1728 普通平衡树 or 洛谷 P3369 【模板】普通平衡树-Splay树模板题
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 22483 Solved: 10130[Submit][S ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- BZOJ 3224 TYVJ 1728 普通平衡树 [Treap树模板]
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 7390 Solved: 3122 [Submit][S ...
- bzoj3224 Tyvj 1728 普通平衡树(名次树+处理相同)
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5354 Solved: 2196[Submit][Sta ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
3224: Tyvj 1728 普通平衡树 Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除 ...
随机推荐
- 6 spark 存储体系
6.1 block存储体系 存储体系架构图 6.2 block 信息信息管理器 6.2.2 bock锁的实现 6.3 磁盘block管理 /* * Licensed to the Apache Sof ...
- Apollo深度磁盘清理
摘要 在Apollo的使用过程中,会出现磁盘空间不足的情况,Apollo的官方提供的方法是删除apollo/data/log或者删除apollo/data/bag文件.但是即使删除了这些,磁盘空间并没 ...
- 更换php工具箱出现问题 CI框架的问题 【问题解决】
2018/10/08 09:56:47 [error] 8472#8588: *1 FastCGI sent in stderr: "PHP Warning: Unknown: open_ ...
- NopCommerce学习(1) Caching
redis教程 http://www.runoob.com/redis/redis-tutorial.html 下载地址:https://github.com/MSOpenTech/redis/rel ...
- oracle的sys和system的默认密码
oracle的sys和system默认密码system默认:manager sys默认:change_on_install使用PL/SQL Plus登录数据库时,system用户使用密码manager ...
- C++快速开发样本工程的建立--建立工程
因为QT建立工程清晰整洁,便于作为样板工程原型.采用QT 5.8.0 64位版本建立工程. 1.建立工程 打开VS2015 新建->新建项目->QT GUI Application -&g ...
- Linux各个文件及其含义
树状目录结构: 以下是对这些目录的解释: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像 ...
- AFNetworking 2.x 的SSL身份认证
一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探 其实这么做的话还是不够的.我们还需要防止中间人攻击(不明白的自己去 ...
- python list内部功能记录
list.append(obj) 在列表末尾添加新的对象 list.count(obj) 统计某个元素在列表中出现的次数 list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用 ...
- 使用Selenium时,如何选择ChromeDriver驱动版本对应Chrome浏览器版本
ChromeDriver版本 支持的Chrome版本 v2.46 v72-74 v2.45 v71-73 v2.44 v70-72 v2.43 v69-71 v2.42 v68-70 v2.41 ...