模板:luogu P3369 【模板】普通平衡树
code:

  1. #include <cstdio>
  2. #include <cstdlib>
  3. const int MAX_N=100010;
  4. int rd() {
  5. int x=0,fla=1; char c=' ';
  6. while(c<'0' or c>'9') {c=getchar();if(c=='-') fla=-fla;}
  7. while(c>='0' and c<='9') x=x*10+c-'0',c=getchar();
  8. return x*fla;
  9. }
  10. struct node{
  11. node *ch[2]; int data,key,size;
  12. node () {}
  13. node(int w,node *son) {ch[0]=ch[1]=son, data=w, key=rand(), size=1;}
  14. void updata () {size = ch[0]->size + ch[1]->size +1;}
  15. }nil,t[MAX_N],*null,*len,*root;;
  16. void init() {
  17. nil=node(0,NULL); null= &nil;
  18. null->ch[0]=null->ch[1]=null;
  19. null->size=0; len=t; root=null;
  20. }
  21. node* newnode(int x) {
  22. *len=node(x,null);
  23. return len++;
  24. }
  25. node* merge(node* a,node* b) {
  26. if(a==null or b==null) return a==null?b:a;
  27. if(a->key > b->key) {a->ch[1]=merge(a->ch[1],b); a->updata(); return a;}
  28. else {b->ch[0]=merge(a,b->ch[0]); b->updata(); return b;}
  29. }
  30. void split(node* x,int k,node* &l,node* &r) {
  31. if(x==null) {l=r=null;return ;}
  32. if(x->data <= k) {l=x; split(l->ch[1],k,l->ch[1],r);}
  33. else {r=x; split(r->ch[0],k,l,r->ch[0]);}
  34. x->updata();
  35. }
  36. void insert(int k) {
  37. node *l,*r; split(root,k,l,r);
  38. root=merge(merge(l,newnode(k)),r);
  39. }
  40. void erase(int k) {
  41. node *l,*mid,*r; split(root,k-1,l,r); split(r,k,mid,r);
  42. root=merge(l,merge(merge(mid->ch[0],mid->ch[1]) ,r));
  43. }
  44. int kth(node *x,int k) {
  45. if(k <= x->ch[0]->size) return kth(x->ch[0],k);
  46. else if(k > x->ch[0]->size+1) return kth(x->ch[1],k - x->ch[0]->size-1);
  47. return x->data;
  48. }
  49. int find(node *x,int d) {
  50. while(x->ch[d]!=null) x=x->ch[d];
  51. return x->data;
  52. }
  53. int main() {
  54. init(); int q=rd(),c; node *l,*r;
  55. while(q--)
  56. switch(c=rd()) {
  57. case 1:insert(rd());break;
  58. case 2:erase(rd());break;
  59. case 3:split(root,rd()-1,l,r);printf("%d\n",l->size+1);root=merge(l,r);break;
  60. case 4:printf("%d\n",kth(root,rd()));break;
  61. case 5:split(root,rd()-1,l,r);printf("%d\n",find(l,1));root=merge(l,r);break;
  62. case 6:split(root,rd(),l,r);printf("%d\n",find(r,0));root=merge(l,r);break;
  63. }
  64. return 0;
  65. }

【模板】 非旋转treap的更多相关文章

  1. BZOJ5063旅游——非旋转treap

    题目描述 小奇成功打开了大科学家的电脑. 大科学家打算前往n处景点旅游,他用一个序列来维护它们之间的顺序.初 始时,序列为1,2,...,n. 接着,大科学家进行m次操作来打乱顺序.每次操作有6步: ...

  2. BZOJ1251序列终结者——非旋转treap

    题目描述 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技 ...

  3. 平衡树及笛卡尔树讲解(旋转treap,非旋转treap,splay,替罪羊树及可持久化)

    在刷了许多道平衡树的题之后,对平衡树有了较为深入的理解,在这里和大家分享一下,希望对大家学习平衡树能有帮助. 平衡树有好多种,比如treap,splay,红黑树,STL中的set.在这里只介绍几种常用 ...

  4. 旋转/非旋转treap的简单操作

    treap(树堆) 是在二叉搜索树的基础上,通过维护随机附加域,使其满足堆性质,从而使树相对平衡的二叉树: 为什么可以这样呢? 因为在维护堆的时候可以同时保证搜索树的性质: (比如当一棵树的一个域满足 ...

  5. 非旋转 treap

    其实之前学过一次非旋转 treap,但是全忘光了,今天复习一下. 洛谷 P3369 [模板]普通平衡树 code: #include <bits/stdc++.h> #define N 1 ...

  6. [bzoj3173]最长上升子序列_非旋转Treap

    最长上升子序列 bzoj-3173 题目大意:有1-n,n个数,第i次操作是将i加入到原有序列中制定的位置,后查询当前序列中最长上升子序列长度. 注释:1<=n<=10,000,开始序列为 ...

  7. 关于非旋转treap的学习

    非旋转treap的操作基于split和merge操作,其余操作和普通平衡树一样,复杂度保证方式与旋转treap差不多,都是基于一个随机的参数,这样构出的树树高为\(logn\) split 作用:将原 ...

  8. [Codeforces702F]T-Shirts——非旋转treap+贪心

    题目链接: Codeforces702F 题目大意:有$n$种T恤,每种有一个价格$c_{i}$和品质$q_{i}$且每种数量无限.现在有$m$个人,第$i$个人有$v_{i}$元,每人每次会买他能买 ...

  9. BZOJ3223文艺平衡树——非旋转treap

    此为平衡树系列第二道:文艺平衡树您需要写一种数据结构,来维护一个有序数列,其中需要提供以下操作: 翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 2 3 4 1 ...

  10. BZOJ3224普通平衡树——非旋转treap

    题目: 此为平衡树系列第一道:普通平衡树您需要写一种数据结构,来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数, ...

随机推荐

  1. asp.net--ado.net5大对象代码示例

    连接数据库 string conn_string ="Data Source=localhost;Initial Catalog=SQLtest;Integrated Security=Tr ...

  2. spring mvc接收http参数

    1.http协议携带参数,无外乎两个三个存储地点:1.url上 ,2.header里 3.body里. 2.get请求是没有body的,数据全都放在url上,以?xx&xxx形式.注:get请 ...

  3. C语言开发函数库时利用不透明指针对外隐藏结构体细节

    1 模块化设计要求库接口隐藏实现细节 作为一个函数库来说,尽力降低和其调用方的耦合.是最主要的设计标准. C语言,作为经典"程序=数据结构+算法"的践行者,在实现函数库的时候,必定 ...

  4. FZU 1851 组合数

    给你两个数n和m,然后让你求组合数C(n,m)中的质因子的个数. 这里用到的一个定理:判断阶乘n!中的质因子 i 的个数的方法---f(n!)=n/i+n/i^2+n/i^3+.....n/i^m ( ...

  5. 杭电1879继续畅通project

    继续畅通project Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...

  6. 《转》Ceilometer Alarm API 參数具体解释 及 举例说明

    Ceilometer Alarm是H版新加入的功能,监控报警是云平台必不可少的部分,Ceilometer已经实现了比較完好的监控体系.报警怎么能缺少呢?用过AWS CloudWatch Alarm的人 ...

  7. 【联系】—— Beta 分布与二项分布、共轭分布

    1. 伯努利分布与二项分布 伯努利分布:Bern(x|μ)=μx(1−μ)1−x,随机变量 x 取值为 0,1,μ 表示取值为 1 的概率: 二项分布:Bin(m|N,μ)=(Nm)μm(1−μ)N− ...

  8. 【POJ 1830】 开关问题

    [题目链接] http://poj.org/problem?id=1830 [算法] 列出异或方程组,用高斯消元求解 [代码] #include <algorithm> #include ...

  9. kindoreditor上传图片

    <!doctype html><html> <head> <meta charset="utf-8" /> <title> ...

  10. JS中的数据类型及判断数据类型的方法

    简单类型(基本类型): number,string,boolean,null,undefined 复杂类型(引用类型):object typeof 只能判断基本数据类型 instanceof 能够判断 ...