LOJ104 普通平衡树
题目描述
这是一道模板题。
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:
- 插入 x 数;
- 删除 x 数(若有多个相同的数,因只删除一个);
- 查询 x 数的排名(若有多个相同的数,因输出最小的排名);
- 查询排名为 x 的数;
- 求 x 的前趋(前趋定义为小于 x,且最大的数);
- 求 x 的后继(后继定义为大于 x,且最小的数)。
输入格式
第一行为 n,表示操作的个数,下面 n 行每行有两个数 opt 和 x, 表示操作的序号(1<=opt<=6)。
输出格式
对于操作 3、4、5、6 每行输出一个数,表示对应答案。
样例
样例输入
10
1 106465
4 1
1 317721
1 460929
1 644985
1 84185
1 89851
6 81968
1 492737
5 493598
样例输出
106465
84185
492737
数据范围与提示
- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 const int maxn=1e5+10;
- 4 struct node
- 5 {
- 6 int val,lc,rc,siz,rd;
- 7 }tr[maxn];
- 8 int cnt,root,n;
- 9 int newnode(int v)
- 10 {
- 11 ++cnt;
- 12 tr[cnt].val=v;
- 13 tr[cnt].siz=1;
- 14 tr[cnt].rd=rand();
- 15 tr[cnt].lc=tr[cnt].rc=0;
- 16 return cnt;
- 17 }
- 18 void update(int cur)
- 19 {
- 20 tr[cur].siz=tr[tr[cur].lc].siz+tr[tr[cur].rc].siz+1;
- 21 }
- 22 int merge(int x,int y)
- 23 {
- 24 if(x*y==0)return x+y;
- 25 if(tr[x].rd<tr[y].rd)
- 26 {
- 27 tr[x].rc=merge(tr[x].rc,y);
- 28 update(x);
- 29 return x;
- 30 }
- 31 else
- 32 {
- 33 tr[y].lc=merge(x,tr[y].lc);
- 34 update(y);
- 35 return y;
- 36 }
- 37 }
- 38 void split(int cur,int v,int &x,int &y)
- 39 {
- 40 if(!cur)x=y=0;
- 41 else
- 42 {
- 43 if(tr[tr[cur].lc].siz+1<=v)
- 44 {
- 45 x=cur;
- 46 split(tr[cur].rc,v-tr[tr[cur].lc].siz-1,tr[cur].rc,y);
- 47 update(cur);
- 48 }
- 49 else
- 50 {
- 51 y=cur;
- 52 split(tr[cur].lc,v,x,tr[cur].lc);
- 53 update(cur);
- 54 }
- 55 }
- 56 }
- 57 void splitv(int cur,int v,int &x,int &y)
- 58 {
- 59 if(!cur)x=y=0;
- 60 else
- 61 {
- 62 if(tr[cur].val<=v)
- 63 {
- 64 x=cur;
- 65 splitv(tr[cur].rc,v,tr[cur].rc,y);
- 66 update(cur);
- 67 }
- 68 else
- 69 {
- 70 y=cur;
- 71 splitv(tr[cur].lc,v,x,tr[cur].lc);
- 72 update(cur);
- 73 }
- 74 }
- 75 }
- 76 void insert(int v)
- 77 {
- 78 int x,y;
- 79 splitv(root,v,x,y);
- 80 root=merge(merge(x,newnode(v)),y);
- 81 }
- 82 void del(int v)
- 83 {
- 84 int x,y,z;
- 85 splitv(root,v,x,z);
- 86 splitv(x,v-1,x,y);
- 87 y=merge(tr[y].lc,tr[y].rc);
- 88 root=merge(merge(x,y),z);
- 89 }
- 90 void find(int v)
- 91 {
- 92 int x,y;
- 93 splitv(root, v-1,x,y);
- 94 printf("%d\n",tr[x].siz+1);
- 95 root=merge(x,y);
- 96 }
- 97 void kth(int now,int v)
- 98 {
- 99 int cur=now;
- 100 if(v>tr[now].siz || v<1)return ;
- 101 while(cur)
- 102 {
- 103 if(tr[tr[cur].lc].siz+1==v)
- 104 {
- 105 printf("%d\n",tr[cur].val);
- 106 return ;
- 107 }
- 108 else if(tr[tr[cur].lc].siz >= v)cur=tr[cur].lc;
- 109 else
- 110 {
- 111 v-=tr[tr[cur].lc].siz+1;
- 112 cur=tr[cur].rc;
- 113 }
- 114 }
- 115 }
- 116 void pre(int v)
- 117 {
- 118 int x,y,z;
- 119 splitv(root,v-1,x,y);
- 120 kth(x,tr[x].siz);
- 121 root=merge(x,y);
- 122 }
- 123 void next(int v)
- 124 {
- 125 int x,y,z;
- 126 splitv(root,v,x,y);
- 127 kth(y,1);
- 128 root=merge(x,y);
- 129 }
- 130 int main()
- 131 {
- 132 scanf("%d",&n);
- 133 for(int op,x,i=0;i<n;++i)
- 134 {
- 135 scanf("%d%d",&op,&x);
- 136 if(op==1)insert(x);
- 137 else if(op==2)del(x);
- 138 else if(op==3)find(x);
- 139 else if(op==4)kth(root,x);
- 140 else if(op==5)pre(x);
- 141 else next(x);
- 142 }
- 143 return 0;
- 144 }
LOJ104 普通平衡树的更多相关文章
- BZOJ3224/LOJ104 普通平衡树 pb_ds库自带红黑树
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- BZOJ3224/LOJ104 普通平衡树 treap(树堆)
您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x2. 删除x(若有多个相同的数,因只删除一个)3. 查询x的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. ...
- [BZOJ3223]Tyvj 1729 文艺平衡树
[BZOJ3223]Tyvj 1729 文艺平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区 ...
- [BZOJ3224]Tyvj 1728 普通平衡树
[BZOJ3224]Tyvj 1728 普通平衡树 试题描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个) ...
- BZOJ3223: Tyvj 1729 文艺平衡树 [splay]
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3595 Solved: 2029[Submit][Sta ...
- [普通平衡树treap]【学习笔记】
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9046 Solved: 3840[Submit][Sta ...
- BZOJ 3224: Tyvj 1728 普通平衡树
3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 9629 Solved: 4091[Submit][Sta ...
- BZOJ 3223: Tyvj 1729 文艺平衡树
3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3628 Solved: 2052[Submit][Sta ...
- 【Splay】bzoj3223-Tyvj1729文艺平衡树
一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...
随机推荐
- [LeetCode]147. Insertion Sort List链表排序
插入排序的基本思想 把排好的放在一个新的变量中,每次拿出新的,排进去 这个新的变量要有超前节点,因为第一个节点可能会有变动 public ListNode insertionSortList(List ...
- 使用UML工具分析类图与类的关系-bouml(java和C++)
在分析类之间的关系时可以借助工具来实现. bouml是一个UML分析工具,最新的版本是收费的,但是之前的版本是免费的. 这里使用的是4.23版. Bouml安装: 安装软件就按照流程走就行了.但是第一 ...
- maven 父子项目 pom
父项目 <!--项目 id--> <artifactId>expressway-cloud-travel</artifactId> <!-- 子模块--> ...
- Mysql 实战关于date,datetime,timestamp类型使用
最近在做一个项目 项目中 不同的小伙伴同时在不同的业务模块中用到了date,datetime,timestamp这三个类型 特别是datetime,timestamp这两个 如果不能理解到位 其实很 ...
- sprignAOP那些术语
那些AOP术语 初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂.通知.增强处理(Advice) 就是你想要的功能,也就是上说的安全.事物.日志等.你给先定义好,然后再想用的地方用一下.包含As ...
- 5.汇编实现裸机LED
首先:操作LED就要操作GPIO alpha的芯片是NXP的IMX6ULL 其GPIO和STM32的命名有所区别 可以看到IMX6ULL的GPIO以其功能进行命名,对应上图中PAD之后的部分 即G ...
- Hbase相关参数详解
转载:http://www.cnblogs.com/nexiyi/p/hbase_config_94.html 版本:0.94-cdh4.2.1 hbase-site.xml配置 hbase.tmp. ...
- PHPExcel-Helper快速构建Excel
项目介绍 PHPExcel-Helper是什么? PHPExcel辅助开发类,帮助开发者快速创建各类excel. github PHPExcel-Helper存在的意义? 官方phpexcel库功能全 ...
- PHP 打水印功能
/** * @param $str 需要打水印的文字 * @param int $size 文字大小 * @param int $red 文字的颜色 rgb r * @param int $gree ...
- 容器编排系统K8s之APIService资源
前文我们聊到了k8s上crd资源的使用和相关说明,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14267400.html:今天我们来了解下k8s的第二种扩展 ...