博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Treap
阅读量:6503 次
发布时间:2019-06-24

本文共 3290 字,大约阅读时间需要 10 分钟。

Treap:

#include
#include
using namespace std;#define INF 0x7fffffff#define ha 19260817#define N 100100inline int rand(){ static int seed=ha; return seed=(int)seed*482711LL%INF;}struct node{ node *ch[2]; int siz,val,key,cnt; inline node(){ ch[0]=ch[1]=NULL; siz=cnt=0; } inline node(int k,int r):key(k),val(r){} inline void update(){ siz=ch[0]->siz+ch[1]->siz+cnt; }};node *root,*null;struct Treap{ inline void init(){ root=null=new node[N]; null->ch[0]=null->ch[1]=null; } inline void rot(node* &u,int op){ node* v=u->ch[op^1]; u->ch[op^1]=v->ch[op]; v->ch[op]=u; u->update(); (u=v)->update(); } void insert(node* &u,int k){ if(!u || u==null){ u=new node(k,rand()); u->siz=u->cnt=1; u->ch[0]=u->ch[1]=null; return ; } if(u->key==k) u->cnt++; else{ int op=k>u->key; insert(u->ch[op],k); if(u->val>u->ch[op]->val) rot(u,op^1); } u->update(); } void erase(node* &u,int k){ if(u==null) return ; if(u->key==k){ if(u->cnt>1) u->cnt--; else if(u->ch[0]==null) u=u->ch[1]; else if(u->ch[1]==null) u=u->ch[0]; else{ int op=u->ch[0]->val>u->ch[1]->val; rot(u,op); erase(u->ch[op],k); } } else erase(u->ch[k>u->key],k); u->update(); } inline int qrnk(int val){ int rnk=1; node* u=root; for(;u!=null;){ if(val
key) u=u->ch[0]; else if(val>u->key){ rnk+=u->ch[0]->siz+u->cnt; u=u->ch[1]; } else return rnk+u->ch[0]->siz; } return rnk; } inline int qkey(int rnk){ node* u=root; for(;u!=null;){ if(rnk<=u->ch[0]->siz) u=u->ch[0]; else if(rnk>u->ch[0]->siz+u->cnt){ rnk-=u->ch[0]->siz+u->cnt; u=u->ch[1]; } else return u->key; } return 0; } inline int qpre(int val){ int pre; node* u=root; for(;u!=null;){ if(val>u->key){ pre=u->key; u=u->ch[1]; } else u=u->ch[0]; } return pre; } inline int qsuc(int val){ int suc; node* u=root; for(;u!=null;){ if(val
key){ suc=u->key; u=u->ch[0]; } else u=u->ch[1]; } return suc; }} tr;int n,op,x;int main(){ scanf("%d",&n); tr.init(); for(int i=1;i<=n;i++){ scanf("%d%d",&op,&x); switch(op){ case 1:tr.insert(root,x);break; case 2:tr.erase(root,x);break; case 3:printf("%d\n",tr.qrnk(x));break; case 4:printf("%d\n",tr.qkey(x));break; case 5:printf("%d\n",tr.qpre(x));break; case 6:printf("%d\n",tr.qsuc(x));break; } } return 0;}

转载于:https://www.cnblogs.com/pelom/p/10259990.html

你可能感兴趣的文章
顶部滑动下拉广告
查看>>
简化代码的微小修改
查看>>
python之CSV文件格式
查看>>
你必须知道的.net学习总结
查看>>
leetcode之Reorder List
查看>>
Axure8.0 网页 or App 鼠标滚动效果
查看>>
文件操作示例脚本 tcl
查看>>
大家好,新年快乐。
查看>>
prototype
查看>>
Android学习路线
查看>>
Linux下的redis的持久化,主从同步及哨兵
查看>>
在相同的主机上创建一个duplicate数据库
查看>>
Date15
查看>>
从Date类型转为中文字符串
查看>>
基于multisim的fm调制解调_苹果开始自研蜂窝网调制解调器 最快2024年能用上?
查看>>
mupdf不支持x64_Window权限维持(七):安全支持提供者
查看>>
cf修改游戏客户端是什么意思_瓦罗兰特很有可能取代cf成为国内最火的fps游戏...
查看>>
proto文件支持继承吗_JavaScript继承(一)——原型链
查看>>
labview如何弹出提示窗口_LabVIEW开发者必读的问答汇总,搞定疑难杂症全靠它了!...
查看>>
提取series中的数值_Python中None和numpy.nan的区别
查看>>