然而就是将指针的地方换成int引用

就是存个代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. #include<ctime>
  5. using namespace std;
  6. struct node
  7. {
  8. int val;
  9. int yuk;
  10. int siz;
  11. int key;
  12. int ch[2];
  13. };
  14. node t[501000];
  15. int tail;
  16. int cmp(int now,int val)
  17. {
  18. if(t[now].val==val) return -1;
  19. return t[now].val > val ? 0 : 1 ;
  20. }
  21. void sum(int &now)
  22. {
  23. t[now].siz=t[t[now].ch[0]].siz+t[t[now].ch[1]].siz+t[now].yuk;
  24. return ;
  25. }
  26. void rotato(int &now,int base)
  27. {
  28. int k=t[now].ch[base^1];
  29. t[now].ch[base^1]=t[k].ch[base];
  30. t[k].ch[base]=now;
  31. sum(now); sum(k);
  32. now=k;
  33. }
  34. int New(int val)
  35. {
  36. ++tail;
  37. t[tail].ch[0]=t[tail].ch[1]=0;
  38. t[tail].siz=1;t[tail].yuk=1;
  39. t[tail].val=val;
  40. t[tail].key=rand();
  41. return tail;
  42. }
  43. void init()
  44. {
  45. t[0].val=0;t[0].yuk=0;
  46. t[0].key=-1;
  47. t[0].ch[0]=t[0].ch[1]=0;
  48. srand(time(NULL));
  49. return ;
  50. }
  51. void insert(int &now,int val)
  52. {
  53. if(now==0){now=New(val);return ;}
  54. int dir=cmp(now,val);
  55. if(dir==-1){t[now].yuk+=1;t[now].siz+=1;return ;}
  56. insert(t[now].ch[dir],val);
  57. if(t[t[now].ch[dir]].key>t[now].key) rotato(now,dir^1);
  58. sum(now);
  59. }
  60. void del(int &now,int val)
  61. {
  62. int dir=cmp(now,val);
  63. if(dir==-1)
  64. if(t[now].yuk>1){t[now].siz-=1,t[now].yuk-=1;return;}
  65. else
  66. {
  67. if(t[now].ch[1]&&t[now].ch[0])
  68. {
  69. int nxt= t[t[now].ch[0]].key > t[t[now].ch[1]].key ? 0 : 1;
  70. rotato(now,nxt^1);
  71. del(t[now].ch[nxt^1],val);
  72. sum(now);return ;
  73. }
  74. if(t[now].ch[1]){now=t[now].ch[1];sum(now);return ;}
  75. else {now=t[now].ch[0];sum(now);return ;}
  76. }
  77. del(t[now].ch[dir],val);sum(now);
  78. return;
  79. }
  80. int nxt(int now,int val)
  81. {
  82. if(!now) return 0x7fffffff;
  83. if(t[now].val>val)
  84. return min(t[now].val,nxt(t[now].ch[0],val));
  85. else
  86. return nxt(t[now].ch[1],val);
  87. }
  88. int pre(int now,int val)
  89. {
  90. if(!now) return -0x7fffffff;
  91. if(t[now].val<val)
  92. return max(t[now].val,pre(t[now].ch[1],val));
  93. else
  94. return pre(t[now].ch[0],val);
  95. }
  96. int find(int &now,int val)
  97. {
  98. int dir=cmp(now,val);
  99. if(dir==-1) return t[t[now].ch[0]].siz+1;
  100. return find(t[now].ch[dir],val) + ( dir ? t[t[now].ch[0]].siz + t[now].yuk : 0);
  101. }
  102. int kth(int &now,int k)
  103. {
  104. if(t[t[now].ch[0]].siz<k&&t[t[now].ch[0]].siz+t[now].yuk>=k)
  105. return t[now].val;
  106. if(k<=t[t[now].ch[0]].siz)
  107. return kth(t[now].ch[0],k);
  108. else
  109. return kth(t[now].ch[1],k-t[t[now].ch[0]].siz-t[now].yuk);
  110. }
  111. int root;
  112. void visit(int now)
  113. {
  114. if(!now)
  115. return ;
  116. visit(t[now].ch[0]);
  117. printf("%d ",t[now].val);
  118. visit(t[now].ch[1]);
  119. return ;
  120. }
  121. int main()
  122. {
  123. int n;
  124. scanf("%d",&n);
  125. int a,b;
  126. for(int i=1;i<=n;i++)
  127. {
  128. scanf("%d%d",&a,&b);
  129. switch(a)
  130. {
  131. case 1:insert(root,b);break;
  132. case 2:del(root,b);break;
  133. case 3:printf("%d\n",find(root,b));break;
  134. case 4:printf("%d\n",kth(root,b));break;
  135. case 5:insert(root,b);printf("%d\n",pre(root,b));del(root,b);break;
  136. case 6:insert(root,b);printf("%d\n",nxt(root,b));del(root,b);break;
  137. }
  138. //visit(root);printf("\n");
  139. }
  140. }

treap数组版的更多相关文章

  1. HDU 4287 Intelligent IME(字典树数组版)

    Intelligent IME Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  2. treap完全版模板

    这是我综合poj1442 3481 2352的treap操作 得到treap完全版模板.(经测AC) 结构体Tree { int key; //键值 int size; //该子树总节点个数 int ...

  3. hdu 1277 AC自动机入门(指针版和数组版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...

  4. Codeforces Gym101502 I.Move Between Numbers-最短路(Dijkstra优先队列版和数组版)

    I. Move Between Numbers   time limit per test 2.0 s memory limit per test 256 MB input standard inpu ...

  5. 字典树模板( 指针版 && 数组版 )

    模板 :  #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...

  6. 非旋 treap 结构体数组版(无指针)详解,有图有真相

    非旋  $treap$ (FHQ treap)的简单入门 前置技能 建议在掌握普通 treap 以及 左偏堆(也就是可并堆)食用本blog 原理 以随机数维护平衡,使树高期望为logn级别, FHQ  ...

  7. 非旋treap (fhq treap) 指针版

    传送门 看了一圈,好像真的没什么用指针的呢.. 明明觉得指针很好看(什么??你说RE???听不见听不见) 其实我觉得用数组的话不RE直接WA调起来不是更困难嘛,毕竟通过gdb还可以知道哪里RE,WA就 ...

  8. 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)

    因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念. 方法的作用:把一系列的代码放在一起,然后再取个别名.之后通过这个别名的调用,就相当于执行了这一系列的代码. 方法的语法:([]中的内 ...

  9. Java课程课后作业190315之最大连续子数组(二维数组版)

    ,, 在本周的课堂上,老师再一次提高了要求,将一维数组升级成为了二维数组,然后求出块状的连续子数组. 一开始还想着借鉴之前球一维数组的O(n)的算法,后来还是没有找到头绪,舍友讲了自己的办法,但是没有 ...

随机推荐

  1. 进入BIOS的步骤

    查看自己的BIOS版本 $ systeminfo 对号入座,电脑进入BIOS的两种实用方法

  2. python csv.reader参数指定

  3. 性能测试工具LoadRunner10-LR之Virtual User Generator 错误处理函数

    VuGen提供了错误处理函数lr_continue_on_error,用来在脚本中实时修改Vuser的出错设置.lr_continue_on_error函数语法结构如下: void lr_contin ...

  4. caffe学习资料

    1.利用Caffe做回归(regression) http://www.cnblogs.com/frombeijingwithlove/p/5314042.html

  5. [转]jquery的ajax交付时“加载中”提示的处理方法

    本文转自:http://www.educity.cn/wenda/77121.html jquery的ajax提交时“加载中”提示的处理方法    方法1:使用ajaxStart方法定义一个全局的“加 ...

  6. (转)awk数组详解及企业实战案例

    awk数组详解及企业实战案例 原文:http://www.cnblogs.com/hackerer/p/5365967.html#_label03.打印数组:1. [root@nfs-server t ...

  7. sqlldr 采集中文数据乱码问题

    测试机上装入数据 发现中文字段全部变成???????,初步判断为字符集问题    更改      UPDATE sys.props$      SET VALUE$='WE8ISO8859P1'    ...

  8. pat1053. Path of Equal Weight (30)

    1053. Path of Equal Weight (30) 时间限制 10 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue G ...

  9. mysql操作命令梳理(3)-pager

    在mysql日常操作中,妙用pager设置显示方式,可以大大提高工作效率.比如select出来的结果集超过几个屏幕,那么前面的结果一晃而过无法看到,这时候使用pager可以设置调用os的more或者l ...

  10. Python built-in 函数

    一.abs(x) 说明:返回绝对值 参数可以是:负数.正数.浮点数或者长整形 实例: abs(-1.2) #返回 1.2 abs(1.2) #返回 1.2 abs(-11216.5) #返回 1121 ...