注意root的v要给一个很奇怪的数,null的s是0。

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <queue>
  8. using namespace std;
  9. const int maxn = + ;
  10. struct Node{
  11. int v, r, s;
  12. Node* ch[];
  13. void maintain(){
  14. s = ch[] -> s + ch[] -> s + ;
  15. return ;
  16. }
  17. }*null = new Node(), *root, nodes[maxn];
  18. queue<Node*> RAM;
  19. int tot = , m;
  20. void init(Node* &o, int v){
  21. o -> ch[] = o -> ch[] = null;
  22. o -> s = ;
  23. o -> r = rand();
  24. o -> v = v;
  25. return ;
  26. }
  27. Node* node(){
  28. Node* o;
  29. if(!RAM.empty()) o = RAM.front(), RAM.pop();
  30. else o = &nodes[tot ++];
  31. return o;
  32. }
  33. void del(Node* &o){
  34. RAM.push(o);
  35. o = null;
  36. return ;
  37. }
  38. void rotate(Node* &o, int d){
  39. Node* k = o -> ch[d ^ ]; o -> ch[d ^ ] = k -> ch[d]; k -> ch[d] = o;
  40. o -> maintain(); k -> maintain(); o = k; return ;
  41. }
  42. void insert(Node* &o, int v){
  43. if(o == null){
  44. o = node();
  45. init(o, v);
  46. }
  47. else{
  48. int d = v > o -> v;
  49. insert(o -> ch[d], v);
  50. if(o -> ch[d] -> r > o -> r) rotate(o, d ^ ); //!
  51. else o -> maintain();
  52. }
  53. return ;
  54. }
  55. void remove(Node* &o, int v){
  56. if(o == null) return ;
  57. if(o -> v == v){
  58. if(o -> ch[] != null && o -> ch[] != null){
  59. int d = o -> ch[] -> r > o -> ch[] -> r;
  60. rotate(o, d); remove(o -> ch[d], v);
  61. }
  62. else{
  63. Node* k = o;
  64. if(o -> ch[] != null) o = o -> ch[];
  65. else o = o -> ch[];
  66. del(k);
  67. }
  68. }
  69. else remove(o -> ch[v > o -> v], v);
  70. if(o != null) o -> maintain();
  71. return ;
  72. }
  73. bool find(Node* &o, int v){
  74. if(o == null) return false;
  75. if(v == o -> v) return true;
  76. return find(o -> ch[v > o -> v], v);
  77. }
  78. void print(Node* &o){
  79. if(o == null) return ;
  80. print(o -> ch[]);
  81. printf("%d ", o -> v);
  82. print(o -> ch[]);
  83. return ;
  84. }
  85. void read(int &x){
  86. x = ; int sig = ; char ch = getchar();
  87. while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
  88. while(isdigit(ch)) x = * x + ch - '', ch = getchar();
  89. x *= sig; return ;
  90. }
  91. void init(){
  92. srand(time());
  93. null -> s = ;
  94. root = node();
  95. init(root, -);
  96. return ;
  97. }
  98. void work(){
  99.  
  100. return ;
  101. }
  102. void print(){
  103.  
  104. return ;
  105. }
  106. int main(){
  107. init();
  108. work();
  109. print();
  110. return ;
  111. }

动态内存Treap的更多相关文章

  1. 【转】Linux C动态内存泄漏追踪方法

    原文:http://www.cnblogs.com/san-fu-su/p/5737984.html C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借 ...

  2. C++指针和动态内存分配

    指针和动态内存分配 数组与指针 数组 数组名是一个指针常量. 数组名传递数据时,传递的是地址. 数组作为函数参数时不指定第一维大小. 对象数组 A a[2] = {A(1,2)}; 执行时先调用有参数 ...

  3. SQLite剖析之动态内存分配

    SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性    SQLite内核和它的内存分配子系统提供以下特性 ...

  4. C和指针 第十一章 动态内存分配

    声明数组时,必须指定数组长度,才可以编译,但是如果需要在运行时,指定数组的长度的话,那么就需要动态的分配内存. C函数库stdlib.h提供了两个函数,malloc和free,分别用于执行动态内存分配 ...

  5. 解决Ubuntu Server 12.04 在Hyper-v 2012 R2中不能使用动态内存的问题

    前言 全新Hyper-v 2012 R2终于开始支持在Linux的VPS中使用动态内存,可以大大优化服务器的资源分配,小弟我兴奋不已,于是抽空时间赶紧升级到 2012 R2,好好整理一番内存分配,不过 ...

  6. 动态内存分配导致Javascript性能的问题

    内存分配对性能的影响是很大的,分配内存本身需要时间,垃圾回收器回收内存也需要时间,所以应该尽量避免在堆里分配内存.不过直到最近优化HoLa cantk时,我才深刻的体会到内存分配对性能的影响,其中有一 ...

  7. C++动态内存管理之shared_ptr、unique_ptr

    C++中的动态内存管理是通过new和delete两个操作符来完成的.new操作符,为对象分配内存并调用对象所属类的构造函数,返回一个指向该对象的指针.delete调用时,销毁对象,并释放对象所在的内存 ...

  8. 【C++】动态内存与智能指针

    C++常见的内存分配方式有三种: 从静态存储区分配,这里主要是存储局部static对象,类的static成员以及定义在函数之外的变量: 从栈内存分配,这里主要是存储函数内的非static对象: 从堆内 ...

  9. C++动态内存分配

    C++动态内存分配1.堆内存分配 :C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(heap)区或自由存储区(free store). 堆的概念:通常定 ...

随机推荐

  1. 从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值。

    从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验证过程检测到有潜在 ...

  2. [CSS3] CSS :target Selector

    The :target selector allows us to interact with a fragment identifier, or hash, in our URL from CSS. ...

  3. 基于redis 内存数据库简单使用

    在ecplise中使用内存数据的客端户,前提要准备要下载两个jar包 commons-pool2-2.0.jar jedis-2.4.2.jar 前提准备做好了,那我们就开启redis的服务,打开一个 ...

  4. python摇骰子猜大小的小游戏

    #小游戏,摇筛子押大小的小游戏玩家初始有1000块钱,可以压大压小作为赌注 import random #定义摇筛子的函数: def roll_dice(number = 3,points = Non ...

  5. 图解MonoForAndroid开发环境搭建

    电脑系统:windows 8.1 企业版 预装VS:2010旗舰版+2013 with update2旗舰版 ==================================== 1.1 安装ja ...

  6. 【转】 iOS学习之sqlite的创建数据库,表,插入查看数据

    原文:  http://blog.csdn.net/totogo2010/article/details/7702207 iOS sqlite数据库操作.步骤是: 先加入sqlite开发库libsql ...

  7. Hibernate 性能优化之抓取策略

    fetch 抓取策略 前提条件:必须是一个对象操作其关联对象. 1. 根据一的一方加载多的一方,在一的一方集合中,有三个值:join/select/subselect 2.根据多的一方加载一的一方, ...

  8. Hive学习之七《 Sqoop import 从关系数据库抽取到HDFS》

    一.什么是sqoop Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 :MySQL ...

  9. C++中public、protected、private

    C++中public.protected.private 第一:private, public, protected 访问标号的访问范围. private:只能由  1.该类中的函数. 2.其友元函数 ...

  10. Android学习----ADB

    adb是什么?:adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具.a ...