题意:动态第k大,可单点更新,操作+原数组范围6e4

年轻人的第一道纯手工树套树

静态第k大可以很轻易的用权值主席树作差而得

而动态第k大由于修改第i个数会影响[i...n]棵树,因此我们不能在原主席树T上扩展,

而是另开一个表示影响的主席树dT并由树状数组来控制更新和查询前缀线段树和

注意更新时dT的下标要遵循树状数组的子集表示方法

查询时留意整个dT下移到儿子的操作

最后祝ZOJ全家Segmentation Fault

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<map>
  6. #define rep(i,j,k) for(int i=j;i<=k;i++)
  7. #define rrep(i,j,k) for(int i=j;i>=k;i--)
  8. #define erep(i,u) for(int i=head[u];~i;i=nxt[i])
  9. #define print(a) printf("%lld",(ll)(a))
  10. #define printbk(a) printf("%lld ",(ll)(a))
  11. #define println(a) printf("%lld\n",(ll)(a))
  12. using namespace std;
  13. const int MAXN = 6e4+11;
  14. const int MAXM = MAXN<<5;
  15. const int MAXT = MAXN; //!!!!
  16. typedef long long ll;
  17. ll read(){
  18. ll x=0,f=1;register char ch=getchar();
  19. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  20. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  21. return x*f;
  22. }
  23. int a[MAXN],b[MAXN],c[MAXN],Q[10006][3],n,m,nn,N;
  24. map<int,int> mp;
  25. char str[1<<5];
  26. const int FLAG = 1e9+7;
  27. struct FST{
  28. int num[MAXM];
  29. int lc[MAXM],rc[MAXM];
  30. int T[MAXN],dT[MAXN],tot;
  31. void init(){
  32. memset(T,0,sizeof T);
  33. memset(dT,0,sizeof dT);
  34. memset(lc,0,sizeof lc);
  35. memset(rc,0,sizeof rc);
  36. memset(num,0,sizeof num);
  37. tot=0;
  38. }
  39. int build(int l,int r){
  40. int cur=++tot;
  41. lc[cur]=rc[cur]=num[cur]=0;
  42. if(l==r) return cur;
  43. int mid=l+r>>1;
  44. lc[cur]=build(l,mid);
  45. rc[cur]=build(mid+1,r);
  46. num[cur]=num[lc[cur]]+num[rc[cur]];
  47. return cur;
  48. }
  49. inline void copy(int cur,int old){
  50. num[cur]=num[old];
  51. lc[cur]=lc[old];
  52. rc[cur]=rc[old];
  53. }
  54. int update(int old,int l,int r,int k,int v){
  55. int cur=++tot;
  56. copy(cur,old);
  57. num[cur]+=v;
  58. if(l==r) return cur;
  59. int mid=l+r>>1;
  60. if(k<=mid) lc[cur]=update(lc[old],l,mid,k,v);
  61. else rc[cur]=update(rc[old],mid+1,r,k,v);
  62. return cur;
  63. }
  64. }fst;
  65. struct FT{
  66. int fstid[MAXT][2];
  67. void init(){
  68. memset(fstid,0,sizeof fstid);
  69. }
  70. inline int lowbit(int x){
  71. return x&-x;
  72. }
  73. void update(int k,int v){
  74. int t=lower_bound(b+1,b+1+N,a[k])-b;
  75. for(int i=k;i<MAXT;i+=lowbit(i)){
  76. fst.dT[i]=fst.update(fst.dT[i],1,N,t,v);
  77. }
  78. }
  79. int query(int k,bool who){
  80. int res=0;
  81. for(int i=k;i>0;i-=lowbit(i)){
  82. res+=fst.num[fst.lc[fstid[i][who]]];
  83. }
  84. return res;
  85. }
  86. }ft;
  87. int query(int st,int ed,int L,int R,int l,int r,int k){
  88. for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.dT[i];
  89. for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.dT[i];
  90. while(1){
  91. if(l==r) return l;
  92. int t=fst.num[fst.lc[ed]]-fst.num[fst.lc[st]];
  93. t+=ft.query(R,1);
  94. t-=ft.query(L,0);
  95. if(k<=t){
  96. ed=fst.lc[ed];
  97. st=fst.lc[st];
  98. for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.lc[ft.fstid[i][0]];
  99. for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.lc[ft.fstid[i][1]];
  100. r=l+r>>1;
  101. }else{
  102. k-=t;
  103. ed=fst.rc[ed];
  104. st=fst.rc[st];
  105. for(int i=L;i>0;i-=ft.lowbit(i)) ft.fstid[i][0]=fst.rc[ft.fstid[i][0]];
  106. for(int i=R;i>0;i-=ft.lowbit(i)) ft.fstid[i][1]=fst.rc[ft.fstid[i][1]];
  107. l=l+r>>1;l++;
  108. }
  109. }
  110. }
  111. int main(){
  112. //freopen("t.in","r",stdin);
  113. //freopen("t.out","w",stdout);
  114. int T=read();
  115. while(T--){
  116. n=read(); m=read();
  117. mp.clear(); nn=n; ft.init();
  118. rep(i,1,n) b[i]=a[i]=read();
  119. rep(i,1,m){
  120. scanf("%s",str);
  121. Q[i][2]=FLAG;
  122. Q[i][0]=read();
  123. Q[i][1]=read();
  124. if(str[0]=='Q') Q[i][2]=read();
  125. else{
  126. ++nn;
  127. b[nn]=a[nn]=Q[i][1];
  128. }
  129. }
  130. sort(b+1,b+1+nn);
  131. N=unique(b+1,b+1+nn)-b-1;
  132. rep(i,1,nn) c[i]=lower_bound(b+1,b+1+N,a[i])-b;
  133. rep(i,1,nn) mp[c[i]]=a[i];
  134. fst.init(); fst.T[0]=fst.build(1,N);
  135. rep(i,1,n) fst.T[i]=fst.update(fst.T[i-1],1,N,c[i],1);
  136. rep(i,1,n) fst.copy(fst.dT[i]=++fst.tot,fst.T[0]);
  137. rep(i,1,m){
  138. if(Q[i][2]!=FLAG){
  139. int L=Q[i][0];
  140. int R=Q[i][1];
  141. int k=Q[i][2];
  142. println(mp[query(fst.T[L-1],fst.T[R],L-1,R,1,N,k)]);
  143. }else{
  144. int k=Q[i][0];
  145. int v=Q[i][1];
  146. ft.update(k,-1);
  147. a[k]=v;
  148. ft.update(k,1);
  149. }
  150. }
  151. }
  152. return 0;
  153. }

ZOJ - 2112 主席树套树状数组的更多相关文章

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

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

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

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

  3. UOJ#291. 【ZJOI2017】树状数组 树套树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ291.html 题解 结论:这个写错的树状数组支持的是后缀加和后缀求和.这里的后缀求和在 x = 0 的时 ...

  4. Codechef EDGEST 树套树 树状数组 线段树 LCA 卡常

    原文链接http://www.cnblogs.com/zhouzhendong/p/9016579.html 题目传送门 - Codechef EDGEST 题意 给定相同点集上的两棵生成树$T_1$ ...

  5. BZOJ3110 [Zjoi2013]K大数查询 树套树 线段树 整体二分 树状数组

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3110 题意概括 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位 ...

  6. BZOJ1452 [JSOI2009]Count 【树套树 (树状数组)】

    1452: [JSOI2009]Count Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 2693  Solved: 1574 [Submit][St ...

  7. [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)

    题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...

  8. 2019南昌网络赛-I. Yukino With Subinterval 线段树套树状数组,CDQ分治

    TMD...这题卡内存卡的真优秀... 所以以后还是别用主席树的写法...不然怎么死的都不知道... 树套树中,主席树方法开权值线段树...会造成空间的浪费...这道题内存卡的很紧... 由于树套树已 ...

  9. 洛谷P3380 【模板】二逼平衡树(树套树)(线段树+树状数组)

    P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...

随机推荐

  1. Ubuntu的SWAP设置

    1. 在Ubuntu中配置使用新创建的Swap分区 Command list: 查找Swap分区的UUID sudo blkid 在/ect/fstab中加入新的Swap分区 sudo gedit / ...

  2. python学习之内部执行流程,内部执行流程,编码(一)

    python的执行流程: 加载内存--->词法分析--->语法分析--->编译--->转换字节码---->转换成机器码---->供给CPU调度 python的编码: ...

  3. MYSQL隐式类型转换

    MYSQL隐式类型转换 关于官方文档中的理解大致是: 如果两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1.不做类型转换 两个参数都是字符串,按 ...

  4. Spring框架总结(十)

    XML方式实现AOP编程 Xml实现aop编程: 1) 引入jar文件 [aop 相关jar, 4个] 2) 引入aop名称空间 3)aop 配置 * 配置切面类 (重复执行代码形成的类) * aop ...

  5. maven中pom.xml中的scope讲解

    一.compile:编译范围compile是默认的范围:如果没有提供一个范围,编译范围依赖在所有的classpath 中可用,同时它们也会被打包.而且这些dependency会传递到依赖的项目中. 二 ...

  6. Linq善解人意之通过MSDN对14个“查询关键字“逐个解剖

    linq中存在的 14个关键字 网址: https://msdn.microsoft.com/zh-cn/library/bb310804.aspx from: 迭代变量 where:对数据源进行逻辑 ...

  7. [LeetCode 题解]: Pascal's Triangle

    Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Retur ...

  8. scvmm2008 错误 2912 0x80041001

    执行scvmm系列作业时抛出错误 2912 0x80041001. 这个原因是由于主机和vmm通信媒介bits服务挂起所引起的,bits全称Background Intelligent Transfe ...

  9. Partition--分区切换

    现有数据表[dbo].[staging_TB1_20131018-104722]和分区表[dbo].[TB1],需要将分区表和数据表中做数据交换 CREATE TABLE [dbo].[staging ...

  10. Ocelot Consul

    1首先创建一个json的配置文件,文件名随便取,我取Ocelot.json 这个配置文件有两种配置方式,第一种,手动填写 服务所在的ip和端口:第二种,用Consul进行服务发现 第一种如下: { & ...