动态区间 $k$ 大
主席树 + 树状数组
树状数组的每个点对应一颗线段树
首先将所有点加入数据结构
枚举 x
code: for(int i = x; i <= n; i += Lowbit(i)) Poi_G(root[i], 1, Length, k, val);
区间修改时
将所有的后缀树的相应位置 -1, 再 +1
主席树查询时
在计算区间和的时候
类似树状数组的查询
将用到的线段树的相应节点加或减

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <cstring>
  6. #include <string>
  7.  
  8. using namespace std;
  9.  
  10. #define LL long long
  11.  
  12. #define gc getchar()
  13. inline int read() {int x = ; char c = gc; while(c < '' || c > '') c = gc;
  14. while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
  15. inline LL read_LL() {LL x = ; char c = gc; while(c < '' || c > '') c = gc;
  16. while(c >= '' && c <= '') x = x * + c - '', c = gc; return x;}
  17. #undef gc
  18.  
  19. const int N = 1e5 + ;
  20.  
  21. struct Node {int opt, l, r, k;} Ask[N];
  22.  
  23. int n, m;
  24. int A[N], Num[N << ], Length;
  25.  
  26. int root[N], Lson[N * ], Rson[N * ], W[N * ];
  27. int root_add[], root_cut[];
  28. int jsadd, jscut;
  29.  
  30. int Lowbit(int x) {return (x & (-x));}
  31.  
  32. int Hjt;
  33.  
  34. void Poi_G(int &rt, int l, int r, int k, int val) {
  35. if(!rt) rt = ++ Hjt;
  36. W[rt] += val;
  37. if(l == r) return ;
  38. int mid = (l + r) >> ;
  39. if(k <= mid) Poi_G(Lson[rt], l, mid, k, val);
  40. else Poi_G(Rson[rt], mid + , r, k, val);
  41. }
  42.  
  43. void Pre_Poi_G(int x, int val) {
  44. int k = lower_bound(Num + , Num + Length + , A[x]) - Num;
  45. for(int i = x; i <= n; i += Lowbit(i)) Poi_G(root[i], , Length, k, val);
  46. }
  47.  
  48. int Sec_A(int l, int r, int k) {
  49. if(l == r) return l;
  50. int sum = ;
  51. for(int i = ; i <= jsadd; i ++) sum += W[Lson[root_add[i]]];
  52. for(int i = ; i <= jscut; i ++) sum -= W[Lson[root_cut[i]]];
  53. int mid = (l + r) >> ;
  54. if(k <= sum) {
  55. for(int i = ; i <= jsadd; i ++) root_add[i] = Lson[root_add[i]];
  56. for(int i = ; i <= jscut; i ++) root_cut[i] = Lson[root_cut[i]];
  57. return Sec_A(l, mid, k);
  58. } else {
  59. for(int i = ; i <= jsadd; i ++) root_add[i] = Rson[root_add[i]];
  60. for(int i = ; i <= jscut; i ++) root_cut[i] = Rson[root_cut[i]];
  61. return Sec_A(mid + , r, k - sum);
  62. }
  63. }
  64.  
  65. int Pre_Sec_A(int l, int r, int k) {
  66. memset(root_add, , sizeof root_add);
  67. memset(root_add, , sizeof root_add);
  68. jsadd = jscut = ;
  69. for(int i = r; i; i -= Lowbit(i)) root_add[++ jsadd] = root[i];
  70. for(int i = l - ; i; i -= Lowbit(i)) root_cut[++ jscut] = root[i];
  71. return Sec_A(, Length, k);
  72. }
  73.  
  74. int main() {
  75. n = read(), m = read();
  76. for(int i = ; i <= n; i ++) A[i] = read(), Num[++ Length] = A[i];
  77. for(int i = ; i <= m; i ++) {
  78. char c[]; scanf("%s", c);
  79. Ask[i].opt = (c[] == 'Q' ? : );
  80. if(Ask[i].opt == ) Ask[i].l = read(), Ask[i].r = read(), Ask[i].k = read();
  81. else {Ask[i].l = read(), Ask[i].k = read(), Num[++ Length] = Ask[i].k;}
  82. }
  83. sort(Num + , Num + Length + );
  84. Length = unique(Num + , Num + Length + ) - Num - ;
  85. for(int i = ; i <= n; i ++) Pre_Poi_G(i, );
  86. for(int i = ; i <= m; i ++) {
  87. if(Ask[i].opt == ) {
  88. int Ans = Num[Pre_Sec_A(Ask[i].l, Ask[i].r, Ask[i].k)];
  89. printf("%d\n", Ans);
  90. } else {
  91. Pre_Poi_G(Ask[i].l, -);
  92. A[Ask[i].l] = Ask[i].k;
  93. Pre_Poi_G(Ask[i].l, );
  94. }
  95. }
  96. return ;
  97. }

luogu 2617的更多相关文章

  1. Luogu Dynamic Ranking (带修改的主席树)

    题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...

  2. Luogu 魔法学院杯-第二弹(萌新的第一法blog)

    虽然有点久远  还是放一下吧. 传送门:https://www.luogu.org/contest/show?tid=754 第一题  沉迷游戏,伤感情 #include <queue> ...

  3. luogu p1268 树的重量——构造,真正考验编程能力

    题目链接:http://www.luogu.org/problem/show?pid=1268#sub -------- 这道题费了我不少心思= =其实思路和标称毫无差别,但是由于不习惯ACM风格的题 ...

  4. [luogu P2170] 选学霸(并查集+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2170 题目描述 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一 ...

  5. [luogu P2647] 最大收益(贪心+dp)

    题目传送门:https://www.luogu.org/problem/show?pid=2647 题目描述 现在你面前有n个物品,编号分别为1,2,3,--,n.你可以在这当中任意选择任意多个物品. ...

  6. YTU 2617: B C++时间类的运算符重载

    2617: B C++时间类的运算符重载 时间限制: 1 Sec  内存限制: 128 MB 提交: 284  解决: 108 题目描述 C++时间类的运算符重载 定义一个时间类Time,其数据成员为 ...

  7. Luogu 考前模拟Round. 1

    A.情书 题目:http://www.luogu.org/problem/show?pid=2264 赛中:sb题,直接暴力匹配就行了,注意一下读入和最后一句话的分句 赛后:卧槽 怎么只有40 B.小 ...

  8. luogu P2580 于是他错误的点名开始了

    luogu  P2580 于是他错误的点名开始了 https://www.luogu.org/problem/show?pid=2580 题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人. 他会一边 ...

  9. CJOJ 1331 【HNOI2011】数学作业 / Luogu 3216 【HNOI2011】数学作业 / HYSBZ 2326 数学作业(递推,矩阵)

    CJOJ 1331 [HNOI2011]数学作业 / Luogu 3216 [HNOI2011]数学作业 / HYSBZ 2326 数学作业(递推,矩阵) Description 小 C 数学成绩优异 ...

随机推荐

  1. Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)

    Qt更新组件出现(“要继续此操作,至少需要一个有效且已启用的储存库”)   目的: 当时在安装Qt时,有些组件暂时没用着,然后过一段时间后,需要用到某些该组件时,不用删掉重新再安装. 操作: Wind ...

  2. Stack Overflow是如何做应用缓存的

    首先要说下缓存是什么?缓存,就是在取出数据结果后,暂时将数据存储在某些可以快速存取的位置(例如各种NoSQL如Redis,HBase,又或MemoryCache等等),于是就可以让这些耗时的数据结果多 ...

  3. 升级win10 1903版后,vmware打开虚拟机黑屏的解决办法

    按照网上给的方法(1-3),又增加了几步(从4开始,只在我自己电脑上实践过): 1. 打开cmd,执行以下命令 netsh winsock reset 2. 重启电脑 3. 以管理员身份执行vmwar ...

  4. 定时任务cron表达式详解

    参考自:https://blog.csdn.net/fanrenxiang/article/details/80361582 一 cron表达式 顺序 秒 分 时 日期 月份 星期 年(可选) 取值 ...

  5. Http 和 Socket 之间的恩爱情仇

    前言 一些刚入门的小伙伴可能会用 Socket,也会用 OkHttp 或者 HttpUrlConnection 等一些 HTTP 客户端工具,这两个东西看着有点像可是又不太一样,到底是哪里不一样呢? ...

  6. 通过DB13备份SystemDB

    配置systemdb capital user name:SYSTEM save -back Save 现在可以通过DB13备份SystemDB Done. Congratulations!

  7. Django之过滤器

    Django 过滤器   过滤器 描述 示例 upper 以大写方式输出 {{ user.name | upper }} add 给value加上一个数值 {{ user.age | add:”5” ...

  8. Python标准库3.4.3-webbrowser-21.1

    21.1. webbrowser — Convenient Web-browser controller Source code: Lib/webbrowser.py  翻译:Z.F. The web ...

  9. CISCO设备配置SSH 登陆

    1. 设置设备域名CISCO ip domain name CISCO2.创建密钥Server(config)#crypto key generate rsa The name for the key ...

  10. 如何使用Jmeter批量构造MySQL测试数据

    前言: 当我们进行API测试.Web Service或者其他系统模块测试时,你可能需要从数据库获取并记录数据.这些测试的目的是检查数据库中指定的数据,或者向数据库添加指定的数据,这篇文章会展示使用JM ...