BZOJ 3224 平衡树模板题
Treap:
//By SiriusRen
#include <cstdio>
#include <algorithm>
using namespace std;
int n,op,xx,ans,size,root;
struct Treap{int ch[2],v,cnt,rnd,sz;}tr[300000];
void Upd(int k){tr[k].sz=tr[k].cnt+tr[tr[k].ch[0]].sz+tr[tr[k].ch[1]].sz;}
void rot(int &k,bool f){int t=tr[k].ch[f];tr[k].ch[f]=tr[t].ch[!f],tr[t].ch[!f]=k,Upd(k),Upd(t),k=t;}
void ins(int &k){
if(!k){k=++size;tr[k].cnt=tr[k].sz=1;tr[k].rnd=rand(),tr[k].v=xx;return;}
tr[k].sz++;
if(tr[k].v==xx){tr[k].cnt++;return;}
bool f=xx>tr[k].v;ins(tr[k].ch[f]);
if(tr[tr[k].ch[f]].rnd<tr[k].rnd)rot(k,f);
}
void del(int &k){
if(tr[k].v==xx){
if(tr[k].cnt>1)tr[k].sz--,tr[k].cnt--;
else if(!(tr[k].ch[0]*tr[k].ch[1]))k=max(tr[k].ch[0],tr[k].ch[1]);
else rot(k,tr[tr[k].ch[0]].rnd>tr[tr[k].ch[1]].rnd),del(k);
}
else tr[k].sz--,del(tr[k].ch[xx>tr[k].v]);
}
int get_rank(int k){
if(tr[k].v==xx)return tr[tr[k].ch[0]].sz+1;
else if(tr[k].v>xx)return get_rank(tr[k].ch[0]);
else return get_rank(tr[k].ch[1])+tr[tr[k].ch[0]].sz+tr[k].cnt;
}
int get_kth(int k,int x){
if(tr[tr[k].ch[0]].sz>=x)return get_kth(tr[k].ch[0],x);
else if(tr[tr[k].ch[0]].sz+tr[k].cnt<x)return get_kth(tr[k].ch[1],x-tr[tr[k].ch[0]].sz-tr[k].cnt);
else return tr[k].v;
}
void get(int k){
if(!k)return;
if(op==5&&tr[k].v<xx)ans=tr[k].v,get(tr[k].ch[1]);
else if(op==5&&tr[k].v>=xx)get(tr[k].ch[0]);
else if(op==6&&tr[k].v>xx)ans=tr[k].v,get(tr[k].ch[0]);
else get(tr[k].ch[1]);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&op,&xx);
if(op==1)ins(root);
else if(op==2)del(root);
else if(op==3)printf("%d\n",get_rank(root));
else if(op==4)printf("%d\n",get_kth(root,xx));
else get(root),printf("%d\n",ans);
}
}
Splay:
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int op,xx,root,n,size;
struct Splay{int ch[2],fa,v,sz,cnt;}tr[300500];
void Upd(int x){tr[x].sz=tr[tr[x].ch[0]].sz+tr[tr[x].ch[1]].sz+tr[x].cnt;}
void rot(int x){
int y=tr[x].fa,z=tr[y].fa;
bool f=(tr[y].ch[1]==x);
tr[y].ch[f]=tr[x].ch[!f];
if(tr[y].ch[f])tr[tr[y].ch[f]].fa=y;
tr[x].ch[!f]=y;tr[y].fa=x;tr[x].fa=z;
if(z)tr[z].ch[tr[z].ch[1]==y]=x;
Upd(y);
}
void splay(int x,int tp){
for(int y,z;(y=tr[x].fa)!=tp;rot(x)){
z=tr[y].fa;
if(z==tp)continue;
if((tr[y].ch[0]==x)==(tr[z].ch[0]==y))rot(y);
else rot(x);
}
if(!tp)root=x;
Upd(x);
}
void insert(int x,int num){
int y=0;
while(x&&tr[x].v!=num)y=x,x=tr[x].ch[num>tr[x].v];
if(x)++tr[x].cnt;
else{
x=++size,tr[x].sz=tr[x].cnt=1,tr[x].fa=y,tr[x].v=num;
if(y)tr[y].ch[num>tr[y].v]=x;
}
splay(x,0);
}
void find(int v){
int x=root;
while(tr[x].ch[v>tr[x].v]&&tr[x].v!=v)x=tr[x].ch[v>tr[x].v];
splay(x,0);
}
int next(int v,bool f){
find(v);
if((tr[root].v>v&&f)||(tr[root].v<v&&!f))return root;
int p=tr[root].ch[f];
while(tr[p].ch[!f])p=tr[p].ch[!f];
return p;
}
void del(int v){
int p=next(v,0),s=next(v,1);
splay(p,0),splay(s,p);
p=tr[s].ch[0];
if(tr[p].cnt>1)tr[p].cnt--,splay(p,0);
else tr[s].ch[0]=0;
}
int kth(int x){
int y=root,p;
if(x>tr[root].sz)return 0;
while(1){
p=tr[y].ch[0];
if(tr[p].sz+tr[y].cnt<x)x=x-tr[p].sz-tr[y].cnt,y=tr[y].ch[1];
else if(tr[p].sz>=x)y=p;
else return tr[y].v;
}
}
int main(){
insert(root,0x3fffffff),insert(root,-0x3fffffff);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&op,&xx);
if(op==1)insert(root,xx);
else if(op==2)del(xx);
else if(op==3)find(xx),printf("%d\n",tr[tr[root].ch[0]].sz);
else if(op==4)printf("%d\n",kth(xx+1));
else printf("%d\n",tr[next(xx,op==6)].v);
}
}
BZOJ 3224 平衡树模板题的更多相关文章
- bzoj 3224 splay模板题4
再刷水题我就废了... #include<iostream> #include<cstdio> #include<algorithm> #include<cs ...
- BZOJ 1588 平衡树 模板题
Treap: //By SiriusRen #include <cstdio> #include <algorithm> using namespace std; int si ...
- HDU 4006 The kth great number 优先队列、平衡树模板题(SBT)
The kth great number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Oth ...
- 【BZOJ 3224】普通平衡树 模板题
删除节点时把节点splay到根: 然后把根左子树的最右边节点splay到根的左孩子上: 然后删除就可以了: 我的教训是删根的时候根的右孩子的父亲指针一定要记得指向根的左孩子!!! my AC code ...
- 【BZOJ 3223】文艺平衡树 模板题
就是打个翻转标记,下推标记时记得交换左右孩子指针,查询kth和中序遍历输出时也记得要下推标记同时交换指针,二者不可缺!←这是易错点 仿陈竞潇学长模板的代码: #include<cctype> ...
- BZOJ 1208 宠物收养所 | 平衡树模板题
BZOJ 1208 宠物收养所 我犯过的错误:删除一个节点后没有update新的根节点,导致size错了! #include <cstdio> #include <cmath> ...
- 洛谷 P3369 BZOJ 3224 【模板】普通平衡树(Treap/SBT)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...
- bzoj 3223 splay模板题3
水题...貌似理解splay怎么维护数列了... 每个点维护一个size,它的位置就是它的size,区间翻转的话可以打标记,find的时候push_down,交换左右子树. #include<i ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
随机推荐
- Ubuntu 如何进入系统文件/etc/profile修改内容
转载:https://blog.csdn.net/cfq1491/article/details/81088117 /etc/profile 默认权限为 -rw-r--r-- 即只有root用户可以修 ...
- HTTP——学习笔记(3)
HTTP报文:用于HTTP协议交互的信息,客户端的HTTP报文叫做 请求报文,响应端的叫做 响应报文 本质:是由多行(用CR+LF作换行符)数据构成的字符串文本 注:CR:回车,打印针回到行首 L ...
- 华夏60 战斗机(最短路dijkstra)
华夏60 战斗机(最短路dijkstra) 华夏60 超音速战斗机是当今世界上机动性能最先进的战斗机.战斗过程中的一个关键问题是如何在最短的时间内使飞机从当前的飞行高度和速度爬升/俯冲到指定的高度并达 ...
- BNUOJ34980方(芳)格(哥)取数(好坑)
方(芳)格(哥)取数 Time Limit: 3000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java class n ...
- js php 数组比較
php 与 javascript 数组除了定义以及 操作上有非常大的差别,还有非常多其他的差别.如今我们就来讨论讨论. 1.大家都知道php比較两个数组是否全相等(值,索引)相等 $a=arra ...
- Mysql-in查询问题
Mysql-in查询问题 标签(空格分隔): mysql 问题:mysql用in语法查询出来的数据少了好多! 我的实际情况: 数据表: content字段记录着一些选项的id,多个选项用逗号隔开,比如 ...
- POJ 2110 二分+暴搜
题意: 给你一个矩阵 ,你能往各个方向走(不走出去就行),每次只能上下左右走一格,问路径上的点权最大值和最小值的差最小是多少. 思路: 首先 二分最后的答案, 暴力枚举当前的区间是啥. DFS 就OK ...
- POJ 3145 线段树 分块?+暴力
思路: 线段树 (分类讨论) 此题数据很水 数据很水 数据很水 但是卡个暴力还是没问题的-- //By SiriusRen #include <cstdio> #include <c ...
- ubuntu14.04下snort的安装(官方文档安装)(图文详解)
不多说,直接上干货! 最近为了科研,需要安装和使用Snort. snort的官网 https://www.snort.org/ Snort作为一款优秀的开源主机入侵检测系统,在windows和Linu ...
- [转]Adobe Creative Cloud 2015 下载 Adobe CC 2015 Download
Adobe Creative Cloud 2015 下载 Adobe 宣布 Creative Cloud 设计套件全线更新! Adobe CC 2015新功能包括: – Premiere Pro ...