谁再管这玩意叫树状数组套主席树我跟谁急

明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已

好吧,其实只有一个指针,指向该结点的权值线段树的当前结点

每次查询之前,要让指针指向根结点

不同结点的权值线段树之间毫无关联

可以看这个:http://blog.csdn.net/popoqqq/article/details/40108669?utm_source=tuicool

  1. #include<cstdio>
  2. #include<algorithm>
  3. using namespace std;
  4. struct Data
  5. {
  6. int p,v;
  7. }t[20010];
  8. int e,en=1;
  9. bool cmp(const Data &a,const Data &b)
  10. {
  11. return a.v<b.v;
  12. }
  13. int n,m,a[20010],ma[20010],x[10010],y[10010],z[10010];
  14. char op[10010][2];
  15. struct Node{int v,ch[2];}T[20010*195];
  16. int root[10010],now[2][10010];
  17. void Init_root(int ql,int qr)
  18. {
  19. --ql;
  20. for(;ql;ql-=(ql&(-ql))) now[0][ql]=root[ql];
  21. for(;qr;qr-=(qr&(-qr))) now[1][qr]=root[qr];
  22. }
  23. int qBIT(int K,int ql,int qr)
  24. {
  25. int res=0;
  26. for(int x=ql-1;x;x-=(x&(-x))) res-=T[T[now[0][x]].ch[0]].v;
  27. for(int x=qr;x;x-=(x&(-x))) res+=T[T[now[1][x]].ch[0]].v;
  28. bool f=(res<K);
  29. for(int x=ql-1;x;x-=(x&(-x))) now[0][x]=T[now[0][x]].ch[f];
  30. for(;qr;qr-=(qr&(-qr))) now[1][qr]=T[now[1][qr]].ch[f];
  31. return res;
  32. }
  33. int Kth(int K,int ql,int qr,int l,int r)//K小值
  34. {
  35. if(l==r) return l;
  36. int m=(l+r>>1),tmp;
  37. if((tmp=qBIT(K,ql,qr))>=K) return Kth(K,ql,qr,l,m);
  38. return Kth(K-tmp,ql,qr,m+1,r);
  39. }
  40. void Update(int p,int v,int cur,int l,int r)
  41. {
  42. if(l==r)
  43. {
  44. T[cur].v+=v;
  45. return;
  46. }
  47. int m=(l+r>>1);
  48. if(p<=m)
  49. {
  50. if(!T[cur].ch[0]) T[cur].ch[0]=++e;
  51. Update(p,v,T[cur].ch[0],l,m);
  52. }
  53. else
  54. {
  55. if(!T[cur].ch[1]) T[cur].ch[1]=++e;
  56. Update(p,v,T[cur].ch[1],m+1,r);
  57. }
  58. T[cur].v=T[T[cur].ch[0]].v+T[T[cur].ch[1]].v;
  59. }
  60. void Update(int pp,int p,int v)
  61. {
  62. for(;pp<=n;pp+=(pp&(-pp)))
  63. Update(p,v,root[pp],1,en);
  64. }
  65. int main()
  66. {
  67. // freopen("bzoj1901.in","r",stdin);
  68. // freopen("bzoj1901.out","w",stdout);
  69. scanf("%d%d",&n,&m);
  70. for(int i=1;i<=n;++i)
  71. scanf("%d",&t[i].v);
  72. e=n;
  73. for(int i=1;i<=m;++i)
  74. {
  75. scanf("%s%d",op[i],&x[i]);
  76. if(op[i][0]=='C')
  77. scanf("%d",&t[++e].v);
  78. else
  79. scanf("%d%d",&y[i],&z[i]);
  80. }
  81. for(int i=1;i<=e;++i)
  82. t[i].p=i;
  83. sort(t+1,t+e+1,cmp);
  84. ma[a[t[1].p]=1]=t[1].v;
  85. for(int i=2;i<=e;++i)
  86. {
  87. if(t[i].v!=t[i-1].v)
  88. ++en;
  89. ma[a[t[i].p]=en]=t[i].v;
  90. }
  91. e=n;
  92. for(int i=1;i<=m;++i)
  93. if(op[i][0]=='C')
  94. z[i]=a[++e];
  95. e=n;
  96. for(int i=1;i<=n;++i)
  97. root[i]=i;
  98. for(int i=1;i<=n;++i)
  99. Update(i,a[i],1);
  100. for(int i=1;i<=m;++i)
  101. if(op[i][0]=='C')
  102. {
  103. Update(x[i],a[x[i]],-1);
  104. a[x[i]]=z[i];
  105. Update(x[i],z[i],1);
  106. }
  107. else
  108. {
  109. Init_root(x[i],y[i]);
  110. printf("%d\n",ma[Kth(z[i],x[i],y[i],1,en)]);
  111. }
  112. return 0;
  113. }

【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings的更多相关文章

  1. BZOJ2141排队——树状数组套权值线段树(带修改的主席树)

    题目描述 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我,吃完果果唱支歌,大家 乐和和.红星幼儿园的小朋友们排起了长长地队伍,准备吃果果.不过因为小朋友们的身高有所区别 ...

  2. luogu3380/bzoj3196 二逼平衡树 (树状数组套权值线段树)

    带修改区间K大值 这题有很多做法,我的做法是树状数组套权值线段树,修改查询的时候都是按着树状数组的规则找出那log(n)个线段树根,然后一起往下做 时空都是$O(nlog^2n)$的(如果离散化了的话 ...

  3. CF1093E Intersection of Permutations 树状数组套权值线段树

    \(\color{#0066ff}{ 题目描述 }\) 给定整数 \(n\) 和两个 \(1,\dots,n\) 的排列 \(a,b\). \(m\) 个操作,操作有两种: \(1\ l_a\ r_a ...

  4. Dynamic Rankings(树状数组套权值线段树)

    Dynamic Rankings(树状数组套权值线段树) 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[ ...

  5. [BZOJ 3295] [luogu 3157] [CQOI2011]动态逆序对(树状数组套权值线段树)

    [BZOJ 3295] [luogu 3157] [CQOI2011] 动态逆序对 (树状数组套权值线段树) 题面 给出一个长度为n的排列,每次操作删除一个数,求每次操作前排列逆序对的个数 分析 每次 ...

  6. 刷题总结——骑士的旅行(bzoj4336 树链剖分套权值线段树)

    题目: Description 在一片古老的土地上,有一个繁荣的文明. 这片大地几乎被森林覆盖,有N座城坐落其中.巧合的是,这N座城由恰好N-1条双 向道路连接起来,使得任意两座城都是连通的.也就是说 ...

  7. 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树

    题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...

  8. 「ZJOI2017」树状数组(二维线段树)

    「ZJOI2017」树状数组(二维线段树) 吉老师的题目真是难想... 代码中求的是 \(\sum_{i=l-1}^{r-1}a_i\),而实际求的是 \(\sum_{i=l}^{r}a_i\),所以 ...

  9. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

随机推荐

  1. 写css时要注意数字的浮动方向

    写css时要注意数字的浮动方向  当数字位数增加时他的方向才是正确的 text-align:right;padding-right:29px;

  2. java 线性规划 和lingo 比较

    model:max=13*A+ 23*B; 5*A + 15*B <480 ; 4*A + 4 *B <160 ; 35* A + 20 *B <1190 ; end Variabl ...

  3. python学习之路——基础篇(3)模块(续)

    re正则表达式.shutil.ConfigParser.xml 一.re 正则元字符和语法: 语法 说明 表达式 完全匹配字符 字符 一般字符 匹配自身 abc abc . 匹配除换行符"\ ...

  4. shell获取ip

    ifconfig -a|grep inet|grep -v 127.0.0.1|grep -v inet6|awk '{print $2}'|tr -d "addr:"

  5. String、StringBuffer、StringBuilder的区别

    在日常开发过程中String字符串估计是被用到最多的变量了,最近看了一些String.StringBuffer和StringBuilder的东西,三者都可以对字符串进行操作,他们究竟有什么区别,以及适 ...

  6. [z]查找锁表并解锁

    select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode f ...

  7. python迭代器和生成器

    迭代器 #可以被netxt()函数调用不断返回一个值的对象成为迭代器:Iterator #迭代器是访问集合元素的一种方式,从集合第一个元素开始(用next()方法)访问就不能回退,便于循环遍历一些较大 ...

  8. java 删除所有HTML工具类

    import java.util.regex.Matcher;import java.util.regex.Pattern; public class HtmlUtil { private stati ...

  9. 配置tomcat解压版

    配置Tomcat[解压版] 选择解压版的Tomcat的理由是可以让我们使用多个Tomcat,但是配置上就会出现一些问题,需要我们手动进行更改配置.我的Tomcat版本是:apache-tomcat-6 ...

  10. ExtJS4插件EditArea

    EditArea是一个支持语法高亮的文本编辑器,同类软件还有Ace, CodeMirror等.具体功能方面的差异,请访问http://en.wikipedia.org/wiki/Comparison_ ...