1、题目大意:区间第k小,有单点修改

2、分析:这个是树状数组套线段树,也是主席树。。。。为什么主席树这么多QAQ

就是树套树的那种插入什么的,注意啊,一定要动态开内存。。不然会爆。。

然后算答案有两种算法,一种是二分答案,然后算一下,另一种就是把logn棵线段树的指针都存一下,

然后再递归找第k大的时候,我们就可以暴力枚举这些指针,别忘了维护他们

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. struct segment{
  7. segment *ls, *rs;
  8. int num;
  9. } *root[10010], ft[11000010];
  10. int cnt;
  11. int a[10010];
  12. int n, m;
  13. inline void tree_insert(segment* &p, int l, int r, int value){
  14. if(p == NULL) p = &ft[cnt ++];
  15. if(l == r){
  16. p -> num ++;
  17. return;
  18. }
  19. int mid = (l + r) / 2;
  20. if(value <= mid) tree_insert(p -> ls, l, mid, value);
  21. else tree_insert(p -> rs, mid + 1, r, value);
  22. p -> num = 0;
  23. if(p -> ls) p -> num += p -> ls -> num;
  24. if(p -> rs) p -> num += p -> rs -> num;
  25. }
  26. inline void tree_Delete(segment* &p, int l, int r, int value){
  27. if(p == NULL) p = &ft[cnt ++];
  28. if(l == r){
  29. p -> num --;
  30. return;
  31. }
  32. int mid = (l + r) / 2;
  33. if(value <= mid) tree_Delete(p -> ls, l, mid, value);
  34. else tree_Delete(p -> rs, mid + 1, r, value);
  35. p -> num = 0;
  36. if(p -> ls) p -> num += p -> ls -> num;
  37. if(p -> rs) p -> num += p -> rs -> num;
  38. }
  39. inline int tree_lessk(segment* &p, int l, int r, int value){
  40. if(!p) return 0;
  41. if(l == r) return p -> num;
  42. int mid = (l + r) / 2;
  43. int ret = 0;
  44. if(value <= mid) ret += tree_lessk(p -> ls, l, mid, value);
  45. else {
  46. if(p -> ls) ret += p -> ls -> num;
  47. ret += tree_lessk(p -> rs, mid + 1, r, value);
  48. }
  49. return ret;
  50. }
  51. inline void insert(int x, int y){
  52. for(; x <= n; x += (x & -x))
  53. tree_insert(root[x], 0, 1000000000, y);
  54. }
  55. inline void Delete(int x, int y){
  56. for(; x <= n; x += (x & -x))
  57. tree_Delete(root[x], 0, 1000000000, y);
  58. }
  59. inline int lessk(int x, int y){
  60. int ret = 0;
  61. for(; x > 0; x -= (x & -x))
  62. ret += tree_lessk(root[x], 0, 1000000000, y);
  63. return ret;
  64. }
  65. int main(){
  66. scanf("%d%d", &n, &m);
  67. for(int i = 1; i <= n; i ++){
  68. scanf("%d", &a[i]);
  69. insert(i, a[i]);
  70. }
  71. char str[2];
  72. int x, y, z;
  73. for(int i = 1; i <= m; i ++){
  74. scanf("%s", str);
  75. scanf("%d%d", &x, &y);
  76. if(str[0] == 'Q'){
  77. scanf("%d", &z);
  78. int l = 0, r = 1000000000;
  79. while(l < r){
  80. int mid = (l + r) / 2;
  81. if(lessk(y, mid) - lessk(x - 1, mid) >= z) r = mid;
  82. else l = mid + 1;
  83. }
  84. printf("%d\n", l);
  85. }
  86. else{
  87. Delete(x, a[x]);
  88. a[x] = y;
  89. insert(x, a[x]);
  90. }
  91. }
  92. return 0;
  93. }

BZOJ1901——Zju2112 Dynamic Rankings的更多相关文章

  1. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  2. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  3. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  4. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...

  5. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  6. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  7. 【分块】bzoj1901 Zju2112 Dynamic Rankings

    区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...

  8. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  9. 【基数排序】bzoj1901 Zju2112 Dynamic Rankings

    论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...

随机推荐

  1. 运算符++,--的使用及 while循环测试的用处

    前++与后++的区别: b=3+(++a);//a=a+1;b=3+a; b=3+(a++);//b=3+a;a=a+1; while (true)( 循环语句,可以实现程序的多次测试) { Cons ...

  2. Win10微软官方最终正式版ISO镜像文件

    Win10微软官方最终正式版ISO镜像文件 据说Windows 10是微软发布的最后一个Windows版本,下一代Windows将作为Update形式出现.Windows 10将发布7个发行版本,分别 ...

  3. docker中启动mysql报错

    [root@5416ec39653b init.d]# /etc/init.d/mysqld start /etc/init.d/mysqld: line 23: /etc/sysconfig/net ...

  4. css媒体查询

    简单解释:http://zh.learnlayout.com/media-queries.html 深入学习1:https://developer.mozilla.org/en-US/docs/Web ...

  5. jsp简单标签开发(一)

    孤傲苍狼 @Override22 public void doTag() throws JspException, IOException {23 //得到代表jsp标签体的JspFragment24 ...

  6. WEBSTORM 打开多个项目的方法

    WebStorm默认情况下一次只能打开一个项目,这点很不爽,其实是可以设置的. 方法: File -> settings -> Directories -> Add Content ...

  7. .NET安全审核检查表

    书籍名称:Web安全设计之道 -.NET代码安全,界面漏洞防范与程序优化   .NET安全审核检查表   检查项 任务描述 设计环节     Security descisions should no ...

  8. Mongodb3.0.6副本集+分片学习笔记

    一.使用问题记录 1. mongodb3.0.6使用mongostat参数 >./mongostat -h 127.0.0.1:27017 -u root -p 123456 /authenti ...

  9. [CentOS7]安装mysql遇到的问题

    摘要 在安装mysql的时候,遇到了一些问题,这里列出所遇到的问题. yum list mysql-server 在使用命令yum list mysql-server安装mysql的时候,遇到如图所示 ...

  10. 几种常用的JS类定义方法(转)

    // 方法1 对象直接量 var obj1 = { v1 : "", get_v1 : function() { return this.v1; }, set_v1 : funct ...