http://www.lydsy.com/JudgeOnline/problem.php?id=3065

思路:替罪羊树套权值线段树。

当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂度:O(nlog^3n)

  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. #include<vector>
  7. #define alpha 0.75
  8. #define N 10000005
  9. int read(){
  10. char ch=getchar();int t=,f=;
  11. while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
  12. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  13. return t*f;
  14. }
  15. int tmp;
  16. int n,m,sz,ans,root;
  17. int v[],dfn[],rt[],ls[],rs[];
  18. struct seg{int l,r,sum;}a[N];
  19. std::vector<int>p,t,rec;
  20. int newnode(){
  21. if (!rec.size()) return ++sz;
  22. else{
  23. int k=rec.back();rec.pop_back();
  24. return k;
  25. }
  26. }
  27. void recliam(int &x){
  28. if (!x) return;
  29. rec.push_back(x);
  30. recliam(a[x].l);recliam(a[x].r);
  31. a[x].sum=;x=;
  32. }
  33. void insert(int &k,int l,int r,int val,int f){
  34. if (!k) k=newnode();
  35. if (l==r){a[k].sum+=f;return;}
  36. int mid=(l+r)>>;
  37. if (val<=mid) insert(a[k].l,l,mid,val,f);
  38. else insert(a[k].r,mid+,r,val,f);
  39. a[k].sum=a[a[k].l].sum+a[a[k].r].sum;
  40. if (!a[k].sum) recliam(k);
  41. }
  42. void build(int &k,int l,int r){
  43. int mid=(l+r)>>;
  44. if (l>r) return;
  45. if (l==r){
  46. k=dfn[l];insert(rt[k],,,v[k],);return;
  47. }
  48. k=dfn[mid];
  49. build(ls[k],l,mid-);build(rs[k],mid+,r);
  50. for (int i=l;i<=r;i++)
  51. insert(rt[k],,,v[dfn[i]],);
  52. }
  53. void del(int &x){
  54. if (!x) return;recliam(rt[x]);
  55. del(ls[x]);p.push_back(x);del(rs[x]);
  56. x=;
  57. }
  58. void rebuild(int &x){
  59. del(x);int s1=p.size();
  60. for (int i=;i<=s1;i++) dfn[i]=p[i-];
  61. build(x,,s1);
  62. p.clear();
  63. }
  64. int modify(int k,int x,int val){
  65. insert(rt[k],,,val,);
  66. int t,L=a[rt[ls[k]]].sum;
  67. if (L+==x){t=v[k];v[k]=val;}
  68. else if (L>=x) t=modify(ls[k],x,val);
  69. else t=modify(rs[k],x-L-,val);
  70. insert(rt[k],,,t,-);
  71. return t;
  72. }
  73. void query(int k,int l,int r){
  74. int L=a[rt[ls[k]]].sum,R=a[rt[k]].sum;
  75. if (l==&&r==R){t.push_back(rt[k]);return;}
  76. if (l<=L+&&r>=L+)p.push_back(v[k]);
  77. if (r<=L)query(ls[k],l,r);
  78. else if (l>L+) query(rs[k],l-L-,r-L-);
  79. else{
  80. if (l<=L) query(ls[k],l,L);
  81. if (R>L+) query(rs[k],,r-L-);
  82. }
  83. }
  84. int solve_query(int L,int R,int K){
  85. query(root,L,R);K--;
  86. int l=,r=,s1=t.size(),s2=p.size();
  87. while (l<r){
  88. int mid=(l+r)>>,sum=;
  89. for (int i=;i<s1;i++) sum+=a[a[t[i]].l].sum;
  90. for (int i=;i<s2;i++)
  91. if (p[i]>=l&&p[i]<=mid) sum++;
  92. if (K<sum){
  93. for (int i=;i<s1;i++) t[i]=a[t[i]].l;
  94. r=mid;
  95. } else{
  96. for (int i=;i<s1;i++) t[i]=a[t[i]].r;
  97. l=mid+;K-=sum;
  98. }
  99. }
  100. t.clear();p.clear();
  101. return l;
  102. }
  103. void insert(int &k,int x,int val){
  104. if (!k){
  105. k=++n;
  106. insert(rt[k],,,val,);
  107. v[k]=val;
  108. return;
  109. }
  110. insert(rt[k],,,val,);
  111. int L=a[rt[ls[k]]].sum;
  112. if (L>=x) insert(ls[k],x,val);else insert(rs[k],x-L-,val);
  113. if (a[rt[k]].sum*alpha>std::max((double)a[rt[ls[k]]].sum,(double)a[rt[rs[k]]].sum)){
  114. if (tmp){
  115. if (ls[k]==tmp) rebuild(ls[k]);
  116. else rebuild(rs[k]);
  117. tmp=;
  118. }
  119. }else tmp=k;
  120. }
  121. int main(){
  122. n=read();
  123. for (int i=;i<=n;i++) v[i]=read();
  124. for (int i=;i<=n;i++) dfn[i]=i;
  125. build(root,,n);
  126. m=read();
  127. char ch[];int x,y,K;
  128. while (m--){
  129. scanf("%s",ch);
  130. x=read();y=read();x^=ans;y^=ans;
  131. switch(ch[]){
  132. case 'Q':K=read();K^=ans;ans=solve_query(x,y,K);printf("%d\n",ans);break;
  133. case 'M':modify(root,x,y);break;
  134. case 'I':tmp=;insert(root,x-,y);if (tmp){tmp=;rebuild(root);}break;
  135. }
  136. }
  137. }

BZOJ 3065 带插入区间K小值的更多相关文章

  1. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  2. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  3. BZOJ 3065 带插入区间K小值(sag套线段树)

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 4696  Solved: 1527[Submit][Status][Di ...

  4. bzoj 3065: 带插入区间K小值(分块)

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

  5. BZOJ 3065 带插入区间K小值 (替罪羊树套线段树)

    毒瘤题.参考抄自博客:hzwer 第一次写替罪羊树,完全是照着题解写的,发现这玩意儿好强啊,不用旋转每次都重构还能nlognnlognnlogn. 还有外面二分和里面线段树的值域一样,那么r = mi ...

  6. 3065: 带插入区间K小值_树套树_替罪羊树_权值线段树

    经过周六一天,周一3个小时的晚自习,周二2个小时的疯狂debug,终于凭借自己切掉了这道树套树题. Code: #include <cstdio> #include <algorit ...

  7. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  8. 【学习笔记】浅析平衡树套线段树 & 带插入区间K小值

    常见的树套树 一般来说,在嵌套数据结构中,线段树多被作为外层结构使用. 但线段树毕竟是 静态 的结构,导致了一些不便. 下面是一个难以维护的例子: 带插入区间 \(k\) 小值问题 来源:Luogu ...

  9. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

随机推荐

  1. android里Toast的用法

    在活动中,可以通过findViewById()方法获取到在布局文件中定义的元素,这里我们传入R.id.button_1,来得到按钮的实例,这个值是刚才在first_layout.xml中通过andro ...

  2. Appium官网Introduction

    英文官网:http://appium.io/introduction.html?lang=zh Appium 简介 Appium是一个开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏 ...

  3. 用htaccess进行访问控制(转)

    1. 文件访问控制 利用 httpd.conf 中的 Order.Files 及 FilesMatch 命令实现的访问控制可以满足大部分要求,但是当用户被拒绝时,他们看到的是硕大的“403 Forbi ...

  4. spring mvc DispatcherServlet详解之一---处理请求深入解析

    要深入理解spring mvc的工作流程,就需要先了解spring mvc的架构: 从上图可以看到 前端控制器DispatcherServlet在其中起着主导作用,理解了DispatcherServl ...

  5. Servlet与JSP的关系

    Servlet与JSP的异同点: 相似点: 都可以生成动态网页 不同点: JSP擅长网页制作,生成页面直观,但不易追踪与排错 Servlet是纯Java,擅长处理流程与业务逻辑,缺点是页面不直观

  6. HDU3480

    题意:给你n个数,然后让你分成m个集合,每个集合有一个值(最大值减最小值,然后平方),求整个集合的可能最小值. 思路:因为每个集合里的值只和最大和最小值有关,所以很容易想到先排序,然后用DP可求得解, ...

  7. @ManyToMany 两个表多对多关联

    两个表属于多对多关系 如 Teacher <=> Student 表teacher 主键 id 表student 主键id 中间关联表 teacher_student 两个字段 t_id ...

  8. jquer “$” 扩展(笔记)

    /** * Created by shanruo on 16-03-10. */ (function ( $ ){ $.extend ({ /* * 根据参数名获取参数 @name String 参数 ...

  9. 7-ajax的同步和异步?

    同步和异步统一根据send()执行的位置来实现分割逻辑同步:1.send()后统一不会被执行,直到http事务完成之后才会之后后续逻辑.2.堵塞send()方法的逻辑.异步:1.send()后面照样执 ...

  10. Linux filesystem structures.

    1. / – Root Every single file and directory starts from the root directory. Only root user has write ...