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

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

1 #include "bits/stdc++.h" 2  3 using namespace std; 4  5 inline int read(){ 6     int s=0,k=1;char ch=getchar(); 7     while(ch<'0'|ch>'9') ch=='-'?k=-1:0,ch=getchar(); 8     while(ch>47&ch<='9') s=s*10+(ch^48),ch=getchar(); 9     return s*k;10 }11 12 const int N=1e5+5,inf=0x7fffffff;13 14 #define size(t) (t?t->size:0)15 16 struct Treap{17     Treap *son[2];18     int fix,val,size;19     Treap (int v){20         size=1,val=v,fix=rand();21         son[0]=son[1]=NULL;22     }23     inline void update(){24         size=1+size(son[0])+size(son[1]);25     }26 }*root;27 28 typedef pair
D;29 30 inline Treap *merge(Treap *a,Treap *b){31 if(!a||!b) return a?a:b;32 if(a->fix
fix){33 a->son[1]=merge(a->son[1],b);a->update();return a;34 }else {35 b->son[0]=merge(a,b->son[0]);b->update();return b;36 }37 }38 39 inline D split(Treap *p,int k){40 if(!p) return D(NULL,NULL);41 D y;42 if(size(p->son[0])>=k) 43 y=split(p->son[0],k),p->son[0]=y.second,p->update(),y.second=p;44 else45 y=split(p->son[1],k-1-size(p->son[0])),p->son[1]=y.first,p->update(),y.first=p;46 return y;47 }48 49 inline int get_rnk(int val){50 int ret=0;51 for(Treap *t=root;t;t=t->son[val>t->val])52 if(t->val
son[0]);53 return ret;54 }55 56 inline int findkth(int k){57 D x=split(root,k-1);58 D y=split(x.second,1);59 Treap *ans=y.first;60 root=merge(merge(x.first,ans),y.second);61 return ans?ans->val:0;62 }63 64 inline void insert(int val){65 int k=get_rnk(val);66 D x=split(root,k);67 Treap *p=new Treap(val);68 root=merge(merge(x.first,p),x.second);69 }70 71 inline void erase(int val){72 int k=get_rnk(val);73 D x=split(root,k);74 D y=split(x.second,1);75 root=merge(x.first,y.second);76 }77 78 int main(){ 79 freopen("phs.in","r",stdin);80 freopen("phs.out","w",stdout);81 srand(1228);82 int m,opt,x;m=read();83 while(m--){84 opt=read(),x=read();85 switch(opt)86 {87 case 1:insert(x);break;88 case 2:erase(x);break;89 case 3:printf("%d\n",get_rnk(x)+1);break;90 case 4:printf("%d\n",findkth(x));break;91 case 5:printf("%d\n",findkth(get_rnk(x)));break;92 case 6:printf("%d\n",findkth(get_rnk(x+1)+1));break;93 }94 }95 }

 

转载于:https://www.cnblogs.com/Troywar/p/8177426.html

你可能感兴趣的文章
stdext - A C++ STL Extensions Libary
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>
java容器---------手工实现Linkedlist 链表
查看>>
three.js 性能优化的几种方法
查看>>
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&amp;&amp;打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>