真是太差了,到现在才打出一个平衡树的板子。。

感谢blackjack大佬提供的数组版treap板子!!基本完全照搬,blackjack太神啦!

但目前我只会这几个最基本的操作(说白了STL的(multi)set)也能干。。。

还差的好远-_-

#include<bits/stdc++.h>
#define L T[x].ls
#define R T[x].rs
using namespace std;
const int N=;
int root,sz,ans;
struct Node{
int val,sz,cnt,ls,rs,key;
}T[N];
void ref(int x){
T[x].sz=T[L].sz+T[R].sz+T[x].cnt;
}
void zig(int &x){
int y=R;
T[x].rs=T[y].ls;T[y].ls=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void zag(int &x){
int y=L;
T[x].ls=T[y].rs;T[y].rs=x;
T[y].sz=T[x].sz;ref(x);ref(y);x=y;
}
void ins(int &x,int v){
if(!x){
x=++sz;
T[x]=(Node){v,,,,,rand()};
return;
}
if(T[x].val==v){
T[x].cnt++;T[x].sz++;
return;
}
T[x].sz++;
if(T[x].val<v){
ins(R,v);
if(T[R].key<T[x].key)
zig(x);
}
else{
ins(L,v);
if(T[L].key<T[x].key)
zag(x);
}
}
void del(int &x,int v){
if(!x)return;
if(T[x].val==v){
if(T[x].cnt>){
T[x].cnt--;T[x].sz--;
return;
}
if(!(L*R)){
x=L+R;return;
}
if(T[L].key<T[R].key)
zag(x),del(x,v);
else
zig(x),del(x,v);
}
else{
T[x].sz--;
if(T[x].val<v)del(R,v);
else del(L,v);
}
}
void pre(int x,int v){
if(!x)return;
if(T[x].val<v)
ans=x,pre(R,v);
else pre(L,v);
}
void nxt(int x,int v){
if(!x)return;
if(T[x].val>v)
ans=x,nxt(L,v);
else nxt(R,v);
}
int qnum(int x,int rk){
if(!x)return ;
if(rk<=T[L].sz)
return qnum(L,rk);
if(rk>T[L].sz+T[x].cnt)
return qnum(R,rk-T[L].sz-T[x].cnt);
return T[x].val;
}
int qrank(int x,int v){
if(!x)return ;
if(T[x].val==v)
return T[L].sz+;
if(T[x].val<v)
return qrank(R,v)+T[L].sz+T[x].cnt;
return qrank(L,v);
}
int main(){
int n;scanf("%d",&n);
while(n--){
int opt,t;scanf("%d%d",&opt,&t);
ans=;
switch(opt){
case :ins(root,t);break;
case :del(root,t);break;
case :ans=qrank(root,t);printf("%d\n",ans);break;
case :ans=qnum(root,t);printf("%d\n",ans);break;
case :pre(root,t);printf("%d\n",T[ans].val);break;
case :nxt(root,t);printf("%d\n",T[ans].val);break;
}
}
}

最新文章

  1. Leetcode 39. Combination Sum
  2. Android Studio--学习系列(2)
  3. JAVA设计模式之不变模式
  4. form表单中控件较多,加载完成后切换页面都很慢的解决方法
  5. jsonp使用规范
  6. 2015.9.11模拟赛 codevs4162 bzoj1774【无双大王】
  7. Hibernate入门之关系篇:多对一和一对多映射
  8. PC--CSS技巧
  9. c#QQ连连看辅助
  10. Swift中的闭包(Closure) 浅析
  11. 8.Spark SQL
  12. XBMC源代码分析 6:视频播放器(dvdplayer)-文件头(以ffmpeg为例)
  13. Linux实战
  14. 编译安装php5.6
  15. iOS动画-从UIView到Core Animation
  16. Windows 版本下 Oracle12.1.0.2 升级Oracle12.2.0.1的步骤
  17. php手动搭建wamp环境(一)--之 Windows系统下PHP环境搭建
  18. [hadoop] hadoop native libraries 编译
  19. Linux下USB suspend/resume源码分析【转】
  20. CentOS 7搭建KVM在线管理面板WebVirtMgr之使用SSH授权登录

热门文章

  1. hibernate 模拟实现和What is and Why O/R Mapping
  2. lucene中Field简介
  3. Linux目录配置——Linux目录配置标准:FHS
  4. 为什么要使用TLSv1.2和System SSL?
  5. API:什么是API?API与interface的区别
  6. Windows Host 文件
  7. IOS 自定义Operation(下载功能)
  8. HDU(4394),数论上的BFS
  9. IBM带库加磁带操作
  10. CentOS安装配置MongoDB