【模板】treap(数组)
2016-03-18 18:45
495 查看
#include<cstdio> #include<iostream> #include<cstdio> #define MAXN 1000000 using namespace std; int ch[MAXN][2],use[MAXN],size[MAXN],rnd[MAXN]; int len=0,rt=0; inline void rotate(int &x,int d) { int t=ch[x][d^1]; ch[x][d^1]=ch[t][d]; ch[t][d]=x; x=t; } inline int cmp(int x,int num) { if(use[x]==num)return -1; return num<use[x] ? 0:1; } void insert(int &x,int num) { if(x==0) {x=++len,use[x]=num,size[x]=1,rnd[x]=rand();} else { int d=cmp(x,num); if(d!=-1) { insert(ch[x][d],num); if(rnd[x]>rnd[ch[x][d]]) rotate(x,d^1); } } } void del(int &x,int num) { int d=cmp(x,num); if(d!=-1)del(ch[x][d],num); else { if(ch[x][0]*ch[x][1]==0) x=ch[x][0]+ch[x][1]; else { int k=rnd[ch[x][0]]<rnd[ch[x][1]]?0:1; rotate(x,d^1); del(ch[x][d^1],num); } } } void print(int x) { if(x==0)return ; print(ch[x][0]); printf("%d ",use[x]); print(ch[x][1]); } int main() { int n=0; int t1; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&t1); insert(rt,t1); } print(rt); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&t1); del(rt,t1); print(rt); } while(1); return 0; }
相关文章推荐
- 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数
- 矩阵快速幂
- 必须学习的语言
- 一种定位内存泄露的方法(Linux)
- oracle word
- ElasticSearch 常用的查询过滤语句
- HDU 3635 Dragon Balls
- Linux 强大的nohup(进程后台执行)
- Date对象简单实例
- Nim游戏和全排列
- 第二周作业
- spotlight监控mysql 以及 Error 800706BA:RPC服务器不可用问题解决办法
- js 小数点后截取5位
- Android Studio Gradle Configuration Errors总结
- Android Studio Gradle Configuration Errors总结
- Android Studio Gradle Configuration Errors总结
- typedef __u32 __bitwise __be32 means in linux [duplicate]
- docker 私有仓库内容
- log4j无法输出日志
- Apple WWDR Intermediate Certificate 下载地址