链接:https://www.luogu.org/problemnew/show/P2617

思路:

如果直接在主席树上修改的话,每次修改都会对后面所有的树造成影响,一次修改的复杂度就会变成 : n*logn,我们套上树状数组维护,每次就最多只用更新logn棵树,复杂度是:logn*logn,是可以接受的;

代码参考hzwer: http://hzwer.com/2835.html

实现代码;

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int M = 2e5+;
  4. int v[M],num[M*],has[M*];
  5. int op[M],A[M],B[M],K[M],rt[M];
  6. int sum[M*],ls[M*],rs[M*];
  7. int L[],R[],a,b,tot,idx,k;
  8.  
  9. int lowbit(int x){
  10. return x&(-x);
  11. }
  12.  
  13. int find(int x){
  14. int l = ,r = tot;
  15. while(l <= r){
  16. int mid = (l + r) >> ;
  17. if(has[mid] < x) l = mid + ;
  18. else r = mid - ;
  19. }
  20. return l;
  21. }
  22.  
  23. void update(int old,int &k,int p,int c,int l,int r){
  24. k = ++idx;
  25. ls[k] = ls[old],rs[k] = rs[old];
  26. sum[k] = sum[old] + c;
  27. if(l == r) return ;
  28. int mid = (l + r) >> ;
  29. if(p <= mid) update(ls[old],ls[k],p,c,l,mid);
  30. else update(rs[old],rs[k],p,c,mid+,r);
  31. }
  32.  
  33. int query(int l,int r,int k){
  34. if(l == r) return l;
  35. int suml = ,sumr = ;
  36. for(int i = ;i <= a;i ++) suml += sum[ls[L[i]]];
  37. for(int i = ;i <= b;i ++) sumr += sum[ls[R[i]]];
  38. int mid = (l + r) >> ;
  39. if(sumr - suml >= k){
  40. for(int i = ;i <= a;i ++) L[i] = ls[L[i]];
  41. for(int i = ;i <= b;i ++) R[i] = ls[R[i]];
  42. return query(l,mid,k);
  43. }
  44. else {
  45. for(int i = ;i <= a;i ++) L[i] = rs[L[i]];
  46. for(int i = ;i <= b;i ++) R[i] = rs[R[i]];
  47. return query(mid+,r,k-(sumr-suml));
  48. }
  49. }
  50.  
  51. int main()
  52. {
  53. int n,m,cnt = ;
  54. scanf("%d%d",&n,&m);
  55. for(int i = ;i <= n;i ++){
  56. scanf("%d",&v[i]);
  57. num[++cnt] = v[i];
  58. }
  59. char s[];
  60. for(int i = ;i <= m;i ++){
  61. scanf("%s",s);
  62. scanf("%d%d",&A[i],&B[i]);
  63. if(s[]=='Q') scanf("%d",&K[i]),op[i] = ;
  64. else num[++cnt] = B[i];
  65. }
  66. sort(num+,num+cnt+);
  67. has[++tot] = num[];
  68. for(int i = ;i <= cnt;i ++){
  69. if(num[i] != num[i-])
  70. has[++tot] = num[i];
  71. }
  72. for(int i = ;i <= n;i ++){
  73. int k = find(v[i]);
  74. for(int j = i;j <= n;j += lowbit(j))
  75. update(rt[j],rt[j],k,,,tot);
  76. }
  77. for(int i = ;i <= m;i ++){
  78. if(op[i]){
  79. a = ; b = ; A[i]--;
  80. for(int j = A[i];j > ;j -= lowbit(j))
  81. L[++a] = rt[j];
  82. for(int j = B[i];j > ;j -= lowbit(j))
  83. R[++b] = rt[j];
  84. printf("%d\n",has[query(,tot,K[i])]);
  85. }
  86. else{
  87. int k = find(v[A[i]]);
  88. for(int j = A[i];j <= n;j += lowbit(j))
  89. update(rt[j],rt[j],k,-,,tot);
  90. v[A[i]] = B[i];
  91. k = find(B[i]);
  92. for(int j = A[i];j <= n;j += lowbit(j))
  93. update(rt[j],rt[j],k,,,tot);
  94. }
  95. }
  96. return ;
  97. }

luogu P2617 Dynamic Rankings && bzoj 1901 (带修改区间第k大)的更多相关文章

  1. 洛谷P2617 Dynamic Rankings 主席树 单点修改 区间查询第 K 大

    我们将线段树套在树状数组上,查询前预处理出所有要一起移动的节点编号,并在查询过程中一起将这些节点移到左右子树上. Code: #include<cstdio> #include<cs ...

  2. 【ZOJ2112】【整体二分+树状数组】带修改区间第k大

    The Company Dynamic Rankings has developed a new kind of computer that is no longer satisfied with t ...

  3. Dynamic Rankings——带修改区间第k大

    三种做法:1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树状 ...

  4. luogu P2617 Dynamic Rankings(分块,n <= 1e4)

    嘟嘟嘟 带修改区间第k大. 然而某谷把数据扩大到了1e5,所以用分块现在只能得50分. 分块怎么做呢?很暴力的. 基本思想还是块内有序,块外暴力统计. 对于修改,直接重排修改的数所在块,时间复杂度O( ...

  5. luogu P2617 Dynamic Rankings(主席树)

    嘟嘟嘟 一句话题意:带修改区间第\(k\)小. 不修改都会,主席树板子.但是有修改就要比较深入的理解主席树了. 众所周知,主席树中以\(i\)为根的线段树维护的是\([1, i]\)这个前缀的权值,因 ...

  6. 少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小

    少年,想学带修改主席树吗 | BZOJ1901 带修改区间第k小 有一道题(BZOJ 1901)是这样的:n个数,m个询问,询问有两种:修改某个数/询问区间第k小. 不带修改的区间第k小用主席树很好写 ...

  7. [luogu P2617] Dynamic Rankings 带修主席树

    带修改的主席树,其实这种,已经不能算作主席树了,因为这个没有维护可持久化的... 主席树直接带修改的话,由于这种数据结构是可持久化的,那么要相应改动,这个节点以后所有的主席树,这样单次修改,就达到n* ...

  8. Luogu P2617 Dynamic Rankings

    带修主席树的模板,因为状态不好所以敲了很长时间,不过写完感觉能更好地理解主席树了. 核心其实就是树状数组套主席树,维护方法不再是以前的那种一步一修改,而是对于树状数组上的每一个点建立一棵权值线段树,然 ...

  9. Luogu P2617 Dynamic Rankings(整体二分)

    题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...

随机推荐

  1. CentOS6.9升级autoconf版本,解决”Autoconf version 2.64 or higher is required“错误

    安装软件时提示说需要Autoconf 2.64或更高的版本: # autoconf configure.ac:: error: Autoconf version 2.64 or higher is r ...

  2. Android ION内存分配

    The Android ION memory allocator 英文原文 ION heaps ION设计的目标 为了避免内存碎片化,或者为一些有着特殊内存需求的硬件,比如GPUs.display c ...

  3. Android studio,第一个生成,调用成功的jni(说多了都是泪)

    0x01 序言: 泪从何处说起呢?其实很早以前就用过android studio写过c++,但是,但是一直没有成功生成过so文件,所以心中一直有一个纠结...为什么不成功呢... 直到今天,由于工作的 ...

  4. java体系结构与工作方式 《深入分析java web 技术内幕》第七章

    java体系结构与工作方式 7.1 JVM体系结构 何谓JVM JVM(Java Virtual Machine) 通过模拟一个计算机来达到一个计算机所具有的计算功能 指令集:计算机所能识别的机器语言 ...

  5. SQL 百万级数据提高查询速度的方法

    ----------------[转] 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 ...

  6. call、apply的作用和区别是什么?

    call().apply()的区别: 相同点: 1.call()和apply()都可以用来间接调用函数,都可以显式调用所需的this.即,任何函数可以作为任何对象的方法来调用. 2.两个方法都可以指定 ...

  7. Bootstrap -- 下拉菜单、输入框组、导航菜单

    Bootstrap -- 下拉菜单.输入框组.导航菜单 1. 下拉菜单 可以使用带有各种大小按钮的下拉菜单:.btn-lg..btn-sm 或 .btn-xs. 实现下拉菜单: <!DOCTYP ...

  8. June. 23rd 2018, Week 25th. Saturday

    We are who we choose to be. 要成为怎样的人,选择在于自己. From Barry Manilow. I believe that we are who we choose ...

  9. DP思想笔记

    一.思想 DP也是把复杂的问题分解为许多子问题,与分治法不同的是,分治法的各个子问题互相之间没有联系,而动态规划却有.前一个子问题的结果与下一步的子问题的结果是什么有关系.这就决定了DP算法肯定有一个 ...

  10. 多线程--wait()和notify(),Thread中的等待和唤醒方法

    package com.thread.test; public class SimpleMN { final static Object object = new Object(); public s ...