一 题面

  Tyvj 1728 普通平衡树

二 分析

  比较明显是可以用平衡二叉搜索树(splay)做的。

  用权值线段树做,前提就是要先离散化,因为权值线段树维护的值域信息。

  板子。

三 AC代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <fstream>
  5.  
  6. using namespace std;
  7. #define lson rt<<1
  8. #define rson rt<<1|1
  9.  
  10. const int MAXN = 1e5 + ;
  11. int N, op[MAXN], opx[MAXN];
  12. struct Node
  13. {
  14. int id, x;
  15. }Data[MAXN];
  16. int A[MAXN];
  17.  
  18. int segTree[MAXN<<];
  19.  
  20. bool Cmpx(const Node &a, const Node &b)
  21. {
  22. return a.x < b.x;
  23. }
  24.  
  25. //p更新的位置,v=-1表示减,v=1表示加
  26. void Update(int p, int v, int rt, int l, int r)
  27. {
  28. segTree[rt] += v;
  29. if(l == r) return;
  30. int mid = (l+r)>>;
  31. if(p <= mid) Update(p, v, lson, l, mid);
  32. else Update(p, v, rson, mid+, r);
  33. }
  34. //第K小
  35. int Kth(int K, int rt, int l, int r)
  36. {
  37. if(l == r)
  38. return l;
  39. int mid = (l+r)>>;
  40. if(segTree[lson] >= K)
  41. return Kth(K, lson, l, mid);
  42. else
  43. return Kth(K-segTree[lson], rson, mid+, r);
  44. }
  45. //数字v的排名
  46. //统计小于v的数的个数
  47. int Rank(int v, int rt, int l, int r)
  48. {
  49. if(r < v)
  50. return segTree[rt];
  51. int mid = (l+r)>>, res = ;
  52. res += Rank(v, lson, l, mid);
  53. //相当于mid+1 < v 那么左边可能还有
  54. if(mid < v-)
  55. res += Rank(v, rson, mid+, r);
  56. return res;
  57. }
  58. //找最右边的数
  59. int Findr(int rt, int l, int r)
  60. {
  61. if(l == r)
  62. return l;
  63. int mid = (l+r)>>;
  64. if(segTree[rson]) return Findr(rson, mid + , r);
  65. return Findr(lson, l, mid);
  66. }
  67. //前驱
  68. int Pre(int v, int rt, int l, int r)
  69. {
  70. if(r < v)
  71. {
  72. if(segTree[rt]) return Findr(rt, l, r);
  73. return ;
  74. }
  75. int mid = (l+r)>>, res;
  76. //如果v > mid+1那么意味着mid+1或后面的数有可能是前驱
  77. if(mid < v- && segTree[rson] && (res=Pre(v,rson,mid+,r)))
  78. return res;
  79. return Pre(v, lson, l, mid);
  80. }
  81. //找最左边的数
  82. int Findl(int rt, int l, int r)
  83. {
  84. if(l == r)
  85. return l;
  86. int mid = (l+r)>>;
  87. if(segTree[lson]) return Findl(lson, l, mid);
  88. return Findl(rson, mid+, r);
  89. }
  90. //后继
  91. int Nex(int v, int rt, int l, int r)
  92. {
  93. if(v < l)
  94. {
  95. if(segTree[rt]) return Findl(rt, l, r);
  96. return ;
  97. }
  98. int mid = (l+r)>>, res;
  99. //如果mid > v表示左子树的数可能是后继
  100. if(v < mid && segTree[lson] && (res=Nex(v,lson,l,mid)))
  101. return res;
  102. return Nex(v, rson, mid + , r);
  103. }
  104.  
  105. int main()
  106. {
  107. //freopen("input.txt", "r", stdin);
  108. scanf("%d", &N);
  109. for(int i = ; i <= N; i++)
  110. {
  111. scanf("%d %d", &op[i], &Data[i].x);
  112. Data[i].id = i;
  113. }
  114. //离散化预处理
  115. sort(Data + , Data + N + , Cmpx);
  116. int cnt = ;
  117. A[cnt] = Data[].x;
  118. opx[Data[].id] = cnt;
  119. for(int i = ; i <= N; i++)
  120. {
  121. if(Data[i].x != Data[i - ].x)
  122. {
  123. cnt++;
  124. }
  125. A[cnt] = Data[i].x;
  126. opx[Data[i].id] = cnt;
  127. }
  128. //建树
  129. memset(segTree, , sizeof(segTree) );
  130. for(int i = ; i <= N; i++)
  131. {
  132. switch(op[i])
  133. {
  134. case : Update(opx[i], , , , cnt); break;
  135. case : Update(opx[i], -, , , cnt); break;
  136. case : printf("%d\n", Rank(opx[i], , , cnt)+); break;
  137. //这里注意第K个数也离散化了!!!
  138. case : printf("%d\n", A[ Kth(A[opx[i]], , , cnt)] ); break;
  139. case : printf("%d\n", A[ Pre(opx[i], , , cnt)] ); break;
  140. case : printf("%d\n", A[ Nex(opx[i], , , cnt)] ); break;
  141. }
  142. }
  143.  
  144. return ;
  145. }

BZOJ_3224 Tyvj 1728 普通平衡树 【离散化+权值线段树】的更多相关文章

  1. R - Weak Pair HDU - 5877 离散化+权值线段树+dfs序 区间种类数

    R - Weak Pair HDU - 5877 离散化+权值线段树 这个题目的初步想法,首先用dfs序建一颗树,然后判断对于每一个节点进行遍历,判断他的子节点和他相乘是不是小于等于k, 这么暴力的算 ...

  2. HDU 6609 离散化+权值线段树

    题意 有一个长度为\(n\)的数组W; 对于每一个\(i\)(\(1<=i<=n\)),你可以选择中任意一些元素W[k] (\(1<=k<i\)),将他们的值改变为0,使得\( ...

  3. P3369 【模板】普通平衡树(权值线段树)

    原来线段树还有这种操作(开成一个桶) 用区间维护在这个区间内元素的个数,离散化一下,居然能达到splay的效果 不仅码量大大减少,而且跑的飞快!!! 6种操作  200多ms 插入 xx 数 删除 x ...

  4. bzoj1588: [HNOI2002]营业额统计(权值线段树)

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 16863  Solved: 6789[Submit][Sta ...

  5. cogs 1829. [Tyvj 1728]普通平衡树 权值线段树

    1829. [Tyvj 1728]普通平衡树 ★★★   输入文件:phs.in   输出文件:phs.out   简单对比时间限制:1 s   内存限制:1000 MB [题目描述] 您需要写一种数 ...

  6. 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题

    “队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄>     线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...

  7. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)

    带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...

  8. [BZOJ3600] 没有人的算术 [重量平衡树+权值线段树]

    题面 传送门 思路 这道题目是陈立杰论文<重量平衡树和后缀平衡树在信息学奥赛中的应用 >中关于重量平衡树维护序列排名算法的一个应用 具体方法为:令根节点保存一个实数区间$[0,1]$ 若当 ...

  9. [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树

    二逼平衡树 bzoj-3196 Tyvj-1730 题目大意:请写出一个维护序列的数据结构支持:查询给定权值排名:查询区间k小值:单点修改:查询区间内定值前驱:查询区间内定值后继. 注释:$1\le ...

随机推荐

  1. 统计学中z分布、t分布、F分布及χ^2分布

    Z就是正态分布,X^2分布是一个正态分布的平方,t分布是一个正态分布除以(一个X^2分布除以它的自由度然后开根号),F分布是两个卡方分布分布除以他们各自的自由度再相除 比如X是一个Z分布,Y(n)=X ...

  2. js去掉字符串前后空格的五种方法(转)

    出处:http://www.2cto.com/kf/201204/125943.html 第一种:循环检查替换[javascript]//供使用者调用  function trim(s){  retu ...

  3. Android文件上传

    服务端: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Syst ...

  4. C#基础入门 十

    C#基础入门 十 Windows应用程序的界面设计 Form.cs:窗体文件,一般用于存放程序员为窗体编写的代码: Form.Designer.cs:窗体设计文件,其中的代码是由VS自动生成的,一般不 ...

  5. [毕业设计][期末作业]二手闲置小程序 免费信息发布系统功能源码(小程序+php后台管理)

    最近做了一个小程序,主要是二手闲置免费信息发布系统的功能,里面包括了登录,发布商品,商品管理,违规投诉,canva商品海报生成,分享等一些基础的功能,可以说代码都是自己辛辛苦苦写出来的.可作为毕业设计 ...

  6. PipelineDB On Kafka

    PipelineDB 安装yum install https://s3-us-west-2.amazonaws.com/download.pipelinedb.com/pipelinedb-0.9.8 ...

  7. Java Been, EJB, POJO 之间的区别

    Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean.但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以 ...

  8. asp.net 导出 Excel

    /// <summary> /// List 数据导出Excel /// </summary> /// <param name="list">数 ...

  9. aspnetPage分页控件

    项目里面有一个分页,刚好知道了aspnetPage分页控件,现在就把实现步骤和代码贴出来分享一下,如有错误欢迎指正. http://www.webdiyer.com  该控件原网址.里面文档 1.首先 ...

  10. .Net面试经验,从北京到杭州

    首先简单说下,本人小本,目前大四软件工程专业,大三阴差阳错地选了.Net方向,也是从大三开始接触.Net.自认为在学生中.net基础还可以,嘿嘿,吹一下. 大四第一学期学校安排去北京培训,培训了两个月 ...