先打上代码以后更新解释

  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. #define REP(i, s, n) for(int i = s; i <= n; i ++)
  7. #define RAP(i, n, s) for(int i = n; i >= s; i --)
  8. #define LOW for(; x; x -= x & (-x))
  9. using namespace std;
  10. const int maxn = + ;
  11. const int Maxn = ;
  12. const int maxnode = * maxn;
  13. int s[maxnode], ls[maxnode], rs[maxnode], A[maxn], root[maxn], Ln, Rn, L[maxn], R[maxn], c[maxn];
  14. int n, Q, ms = ;
  15. void update(int x, int& y, int L, int R, int pos, int v){
  16. s[y = ++ ms] = s[x] + v;
  17. if(L == R) return ;
  18. int M = L + R >> ;
  19. ls[y] = ls[x]; rs[y] = rs[x];
  20. if(pos <= M) update(ls[x], ls[y], L, M, pos, v);
  21. else update(rs[x], rs[y], M + , R, pos, v);
  22. return ;
  23. }
  24. void update(int x, int v){
  25. for(int i = x; i <= Maxn; i += i & (-i)) update(c[i], c[i], , Maxn, A[x], -); A[x] = v;
  26. for(int i = x; i <= Maxn; i += i & (-i)) update(c[i], c[i], , Maxn, A[x], ); return ;
  27. }
  28. void init(int x, int tp){
  29. if(!tp) { L[++ Ln] = root[x]; LOW if(c[x]) L[++ Ln] = c[x]; }
  30. else { R[++ Rn] = root[x]; LOW if(c[x]) R[++ Rn] = c[x]; }
  31. return ;
  32. }
  33. int query(int ql, int qr, int k){
  34. Ln = Rn = ; init(qr, ); init(ql - , );//0是左
  35. int ll = , rr = Maxn;
  36. while(ll < rr){
  37. int Lsum = , Rsum = , M = ll + rr >> ;
  38. REP(i, , Ln) Lsum += s[ls[L[i]]];
  39. REP(i, , Rn) Rsum += s[ls[R[i]]];
  40. int kth = Rsum - Lsum;
  41. if(kth >= k){//往左找
  42. REP(i, , Ln) L[i] = ls[L[i]];
  43. REP(i, , Rn) R[i] = ls[R[i]];
  44. rr = M;
  45. }
  46. else{//往右找
  47. REP(i, , Ln) L[i] = rs[L[i]];
  48. REP(i, , Rn) R[i] = rs[R[i]];
  49. ll = M + ; k -= kth; //看好了二分! 别忘了还要减 Σ( ° △ °|||)︴
  50. }
  51. }
  52. return ll;
  53. }
  54. inline void read(int &x){
  55. x = ; int sig = ; char ch = getchar();
  56. while(!isdigit(ch)) { if(ch == '-') sig = -; ch = getchar(); }
  57. while(isdigit(ch)) x = * x + ch - '', ch = getchar();
  58. x *= sig; return ;
  59. }
  60. inline void write(int x){
  61. if(x == ) { putchar(''); return ; }
  62. if(x < ) putchar('-'), x = -x;
  63. int len = , buf[];
  64. while(x) buf[len ++] = x % , x /= ;
  65. RAP(i, len - , ) putchar(buf[i] + ''); return ;
  66. }
  67. void init(){
  68. read(n); read(Q);
  69. REP(i, , n) read(A[i]);
  70. REP(i, , n) update(root[i - ], root[i], , Maxn, A[i], );
  71. return ;
  72. }
  73. void work(){
  74. int tp, ql, qr, k, x, v;
  75. while(Q --){
  76. read(tp);
  77. if(tp) read(ql), read(qr), read(k), write(query(ql, qr, k) - ), putchar('\n');// 减一
  78. else read(x), read(v), update(x, v);
  79. }
  80. return ;
  81. }
  82. void print(){
  83.  
  84. return ;
  85. }
  86. int main(){
  87. init();
  88. work();
  89. print();
  90. return ;
  91. }

逗比版:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<algorithm>
  5. #define t node[d]
  6. #define cnt countn[d]
  7. #define repnode(d) for(int i=1;i<=countn[d];i++)
  8. using namespace std;
  9. const int maxn=+,maxnode=+,Max=;
  10. int ls[maxnode],rs[maxnode],s[maxnode],root[maxn],A[maxn],c[maxn],n,m,ms=,countn[],node[][maxn],sum[];
  11. void update(int x,int& y,int L,int R,int pos,int d){
  12. s[y=++ms]=s[x]+d;
  13. if(L==R) return;
  14. ls[y]=ls[x];rs[y]=rs[x];
  15. int M=L+R>>;
  16. if(pos<=M) update(ls[x],ls[y],L,M,pos,d);
  17. else update(rs[x],rs[y],M+,R,pos,d);
  18. return;
  19. }
  20. void update(int x,int v){
  21. for(int i=x;i<=Max;i+=i&-i) update(c[i],c[i],,Max,A[x],-);A[x]=v;
  22. for(int i=x;i<=Max;i+=i&-i) update(c[i],c[i],,Max,A[x],);return;
  23. }
  24. void init(int x,int d){
  25. t[++cnt]=root[x];
  26. for(;x;x-=x&-x) if(c[x]) t[++cnt]=c[x];
  27. return;
  28. }
  29. int query(int ql,int qr,int k){
  30. countn[]=countn[]=;
  31. init(qr,);init(ql-,);
  32. int L=,R=Max,d;
  33. while(L<R){
  34. sum[]=sum[]=;
  35. int M=L+R>>;
  36. repnode(d=) sum[d]+=s[ls[t[i]]];
  37. repnode(d=) sum[d]+=s[ls[t[i]]];
  38. int kth=sum[]-sum[];
  39. if(k<=kth){
  40. repnode(d=) t[i]=ls[t[i]];
  41. repnode(d=) t[i]=ls[t[i]];
  42. R=M;
  43. }
  44. else{
  45. repnode(d=) t[i]=rs[t[i]];
  46. repnode(d=) t[i]=rs[t[i]];
  47. L=M+;k-=kth;
  48. }
  49. } return L;
  50. }
  51. inline int read(){
  52. int x=,sig=;char ch=getchar();
  53. while(!isdigit(ch)){if(ch=='-') sig=-;ch=getchar();}
  54. while(isdigit(ch)) x=*x+ch-'',ch=getchar();
  55. return x*=sig;
  56. }
  57. inline void write(int x){
  58. if(x==){putchar('');return;} if(x<) putchar('-'),x=-x;
  59. int len=,buf[]; while(x) buf[len++]=x%,x/=;
  60. for(int i=len-;i>=;i--) putchar(buf[i]+'');return;
  61. }
  62. void init(){
  63. n=read();m=read();
  64. for(int i=;i<=n;i++) A[i]=read();
  65. for(int i=;i<=n;i++) update(root[i-],root[i],,Max,A[i],);
  66. return;
  67. }
  68. void work(){
  69. int tp,i,j,k,x,v;
  70. while(m--){
  71. tp=read();
  72. if(tp){
  73. i=read();j=read();k=read();
  74. write(query(i,j,k)-);putchar('\n');
  75. }
  76. else{
  77. x=read();v=read();
  78. update(x,v);
  79. }
  80. }
  81. return;
  82. }
  83. void print(){
  84. return;
  85. }
  86. int main(){
  87. init();work();print();return ;
  88. }

主席树套树状数组 动态区间第k小的更多相关文章

  1. 主席树--动态区间第k小

    主席树--动态区间第\(k\)小 模板题在这里洛谷2617. 先对几个问题做一个总结: 阅读本文需要有主席树的基础,也就是通过区间kth的模板题. 静态整体kth: sort一下找第k小,时间复杂度\ ...

  2. 【POJ2104】【整体二分+树状数组】区间第k大

    Description You are working for Macrohard company in data structures department. After failing your ...

  3. G - KiKi's K-Number(树状数组求区间第k大)

    For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. No ...

  4. Dynamic Rankings || 动态/静态区间第k小(主席树)

    JYF大佬说,一星期要写很多篇博客才会有人看 但是我做题没有那么快啊QwQ Part1 写在前面 区间第K小问题一直是主席树经典题=w=今天的重点是动态区间第K小问题.静态问题要求查询一个区间内的第k ...

  5. 主席树初步学习笔记(可持久化数组?静态区间第k大?)

    我接触 OI也快1年了,然而只写了3篇博客...(而且还是从DP跳到了主席树),不知道我这个机房吊车尾什么时候才能摸到大佬们的脚后跟orz... 前言:主席树这个东西,可以说是一种非常畸形的数据结构( ...

  6. 主席树总结(经典区间第k小问题)(主席树,线段树)

    接着上一篇总结--可持久化线段树来整理吧.点击进入 这两种数据结构确实有异曲同工之妙.结构是很相似的,但维护的主要内容并不相同,主席树的离散化.前缀和等思想也要更难理解一些. 闲话 话说刚学习主席树的 ...

  7. 区间第K小——可持久化线段树模板

    概念 可持久化线段树又叫主席树,之所以叫主席树是因为这东西是fotile主席创建出来的. 可持久化数据结构思想,就是保留整个操作的历史,即,对一个线段树进行操作之后,保留访问操作前的线段树的能力. 最 ...

  8. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

  9. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

随机推荐

  1. Web日程管理FullCalendar

    fullcalendar是一款jQuery日程管理控件,提供了丰富的属性设置和方法调用,官网下载地址http://fullcalendar.io/download,眼下最新版本号是2.3.2. 仅仅要 ...

  2. const中的一些tricky的地方

    1. 为了逻辑上的优化需要,const成员函数可能想修改某些成员变量,把这些成员变量定义为mutable可以绕过const的检查 2. 调用const和non-const的参数的函数可以重载 3. s ...

  3. IntentFilter

    当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些Intent,那么就需要用到IntentFilter对象. 顾名思义,IntentFilter对象负责过滤掉组件无法 ...

  4. 获取外网IP地址

    public static string GetRealIP(){            string result = String.Empty;            result = HttpC ...

  5. 一段jquery代码,保存

    @CHARSET "UTF-8"; #table_id tbody tr.odd td:hover{ background-color:#93CFE5; } #table_id t ...

  6. c# 网站发布

    .net 网站发布简单步骤: 1.选择需要发布的网站,右击->发布 1)配置文件:可以任意新建文件配置名 2)连接: 发布方法选择系统文件:选择目标位置,任意新建一个位置即可. 3)设置:选择D ...

  7. leetcode修炼之路——387. First Unique Character in a String

    最近公司搬家了,有两天没写了,今天闲下来了,继续开始算法之路. leetcode的题目如下: Given a string, find the first non-repeating characte ...

  8. 使用Instant Client配置PL/SQL Developer

    之前使用PL/SQL Developer都是直接在本机安装完整版的Oracle Database,一是省事,二是可以在本机做一些demo测试:最近换了台电脑,感觉Instant Client更简单一些 ...

  9. 使用<span>标签为文字设置单独样式

    这一小节讲解<span>标签,我们对<em>.<strong>.<span>这三个标签进行一下总结: 1. <em>和<strong& ...

  10. HashMap、HashTable学习

    HashMap: HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io.Serializable接口. HashMap 的实现不是同步的,这意味着它不是线程安 ...