【算法】平衡树(treap)

【题解】treap知识见数据结构

在POJ把语言从G++换成C++就过了……???

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<ctime>
  4. using namespace std;
  5. const int maxn=;
  6. struct cyc{int num,w,rnd,l,r;}t[maxn*];
  7. int n,m,root,sz,s,tt,d[maxn];
  8. void rr(int &tt)//右旋
  9. {
  10. int k=t[tt].l;
  11. t[tt].l=t[k].r;
  12. t[k].r=tt;
  13. tt=k;
  14. }
  15. void lr(int &tt)
  16. {
  17. int k=t[tt].r;
  18. t[tt].r=t[k].l;
  19. t[k].l=tt;
  20. tt=k;
  21. }
  22. void insert(int &w,int x)
  23. {
  24. if(w==)
  25. {
  26. w=++sz;
  27. t[w].num=x;
  28. t[w].w=;
  29. t[w].rnd=rand();
  30. return;
  31. }
  32. if(t[w].num==x){t[w].w++;return;};
  33. if(x<t[w].num)
  34. {
  35. insert(t[w].l,x);
  36. if(t[t[w].l].rnd<t[w].rnd)rr(w);
  37. }
  38. if(x>t[w].num)
  39. {
  40. insert(t[w].r,x);
  41. if(t[t[w].r].rnd<t[w].rnd)lr(w);
  42. }
  43. }
  44. void del(int &w,int x)
  45. {
  46. if(t[w].num==x)
  47. {
  48. if(t[w].w>)
  49. {
  50. t[w].w--;
  51. return;
  52. }
  53. if(t[w].l*t[w].r==)w=t[w].l+t[w].r;//如果只有一颗子树,用这颗子树代替这个节点就可以删除了(没有子树则是用0代替之)。
  54. else
  55. if(t[t[w].l].rnd<t[t[w].r].rnd)
  56. {
  57. rr(w);
  58. // del(t[w].r,x);
  59. del(w,x);
  60. }
  61. else
  62. {
  63. lr(w);
  64. // del(t[w].l,x);
  65. del(w,x);
  66. }
  67. }
  68. else if(t[w].num<x)del(t[w].r,x);
  69. else del(t[w].l,x);
  70. }
  71. void find(int w,int x)
  72. {
  73. if(w==)return;
  74. if(t[w].num>=x&&t[w].num<tt)tt=t[w].num;
  75. if(t[w].num<=x&&t[w].num>s)s=t[w].num;
  76. if(t[w].num>x)find(t[w].l,x);
  77. if(t[w].num<x)find(t[w].r,x);
  78. }
  79. int main()
  80. {
  81. srand(time());
  82. scanf("%d%d",&n,&m);
  83. for(int i=,j=;i<=m;i++)
  84. {
  85. // printf("[]");
  86. char c=getchar();int x;
  87. c=getchar();//printf("[c=%c]",c);
  88. // while(c<'A'&&c>'Z')c=getchar();
  89. if(c=='D')
  90. {
  91. scanf("%d",&x);
  92. insert(root,x);
  93. d[++j]=x;
  94. }
  95. if(c=='R')del(root,d[j--]);
  96. if(c=='Q')
  97. {
  98. s=,tt=n+;
  99. scanf("%d",&x);
  100. find(root,x);
  101. if(s==tt)printf("0\n");
  102. else printf("%d\n",tt-s-);
  103. }
  104. }
  105. return ;
  106. }

【POJ】2892 Tunnel Warfare的更多相关文章

  1. 【HDOJ】1540 Tunnel Warfare

    还不错的一道线段树区间合并.挺巧妙的用法. /* 1540 */ #include <iostream> #include <string> #include <map& ...

  2. 【POJ】1704 Georgia and Bob(Staircase Nim)

    Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...

  3. 【POJ】1067 取石子游戏(博弈论)

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

  4. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  5. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  6. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

  7. 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉

    DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $  当然这里的$i$和$k$都是偶数啦~ ...

  8. 【POJ】【2104】区间第K大

    可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...

  9. 【POJ】1222 EXTENDED LIGHTS OUT

    [算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...

随机推荐

  1. zookeeper伪集群安装

    记录下zookeeper伪分布式搭建的过程,假设系统已经配置好了JAVA环境. 1.准备环境 linux服务器一台,下载某个版本的zookeeper压缩包,下载链接:http://apache.cla ...

  2. CSS设计指南之CSS三种机制:继承、层叠和特指

    一.继承 CSS中的祖先元素也会向后代传递一样东西:CSS属性的值.body元素是所有元素的祖先,所有标签都是它的后代,比如为body元素设置一种字体,那么文档中的所有元素,无论它在层次结构中多么靠下 ...

  3. java基础简介

    一.软件开发 软件:是由数据和指令组成的(例:计算器) 如何实现软件开发呢?    就是使用开发工具和计算机语言做出东西来 二.常用dos命令 d: 回车 盘符切换 dir(directory):列出 ...

  4. [BZOJ5463] [APIO2018] 铁人两项

    题目链接 LOJ. BZOJ. Solution 先建圆方树. 我们考虑暴力,枚举一个点对,我们枚举的点都是圆点,然后统计中间那个点可以取的位置的数量,加起来就是答案. 那么怎么统计呢,我们对于每个点 ...

  5. POJ3421:X-factor Chains——题解

    http://poj.org/problem?id=3421 题目大意:一个数列,起始为1,终止为一给定数X,满足Xi < Xi+1 并且Xi | Xi+1. 求出数列最大长度和该长度下的情况数 ...

  6. 无序数组中第Kth大的数

    题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指of ...

  7. [Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:  You may assume th ...

  8. POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理)

    POJ.1006 Biorhythms (拓展欧几里得+中国剩余定理) 题意分析 不妨设日期为x,根据题意可以列出日期上的方程: 化简可得: 根据中国剩余定理求解即可. 代码总览 #include & ...

  9. HDU 2083(排序+绝对值+中间值求和)

    简易版之最短距离 点我跳转到HDOJ Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  10. NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2题解

    上星期打的...题有点水,好多人都AK了 T1排个序贪心就好了 #include<iostream> #include<cstring> #include<cstdlib ...