以前看到这题都瑟瑟发抖,终于过了心情舒畅。

按下标为关键字建替罪羊树,每个结点开一个权值线段树,维护的这个结点代表的子树的信息。

这题还得垃圾回收,自己yy的,不知对不对..

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. #define M ((L+R)>>1)
  5. #define l(x) t[x].s[0]
  6. #define r(x) t[x].s[1]
  7. #define L(x) t2[x].s[0]
  8. #define R(x) t2[x].s[1]
  9.  
  10. const int N=;
  11. char op[];
  12. int n,x,y,z,q,rt,tt,t1,la,tp,tp2,V,st[N],st2[N],rb[N*],rb2[N*];
  13. struct nd {int x,v,sz,s[];}t[N*],t2[N*];
  14.  
  15. void dl(int x) {if(!x) return; rb2[++tt]=x,dl(L(x)),dl(R(x)),t2[x].x=L(x)=R(x)=;}
  16. void upd(int &o,int L,int R,int x,int y) {
  17. if(!o) o=rb2[tt--]; t2[o].x+=y;
  18. if(L==R) return;
  19. if(x<=M) upd(L(o),L,M,x,y); else upd(R(o),M+,R,x,y);
  20. if(!t2[o].x) dl(o),o=;
  21. }
  22. void ge(int x) {if(!x) return; ge(l(x)),st[++tp]=x,ge(r(x));}
  23. void mr(int l,int r,int &x) {
  24. if(!l&&!r) return; t2[x=rb2[tt--]].x=t2[l].x+t2[r].x,mr(L(l),L(r),L(x)),mr(R(l),R(r),R(x));
  25. }
  26. void bd(int &x,int L,int R) {
  27. if(L>R) return; t[x=rb[t1--]].v=t[st[M]].v;
  28. if(L==R) t[x].sz=;
  29. else bd(l(x),L,M-),bd(r(x),M+,R),mr(t[l(x)].x,t[r(x)].x,t[x].x),t[x].sz=t[l(x)].sz+t[r(x)].sz+;
  30. upd(t[x].x,,N,t[x].v,);
  31. }
  32. void rm() {for(int i=;i<=tp;i++) dl(t[st[i]].x),l(st[i])=r(st[i])=t[st[i]].x=t[st[i]].v=t[st[i]].sz=;}
  33. void ins(int &x,int p,int v) {
  34. if(!x) x=rb[t1--]; upd(t[x].x,,N,v,),t[x].sz++;
  35. if(!t[x].v) {t[x].v=v; return;}
  36. if(t[l(x)].sz+>=p) ins(l(x),p,v); else ins(r(x),p-t[l(x)].sz-,v);
  37. if(t[x].sz*0.75<max(t[l(x)].sz,t[r(x)].sz)) tp=,ge(x),bd(x,,tp),rm();
  38. }
  39. void gt(int x,int l,int r) {
  40. if(r-l+==t[x].sz) {st[++tp]=t[x].x; return;}
  41. if(l<=t[l(x)].sz) gt(l(x),l,min(r,t[l(x)].sz));
  42. if(l<=t[l(x)].sz+&&r>=t[l(x)].sz+) st2[++tp2]=t[x].v;
  43. if(r>t[l(x)].sz+) gt(r(x),max(l-t[l(x)].sz-,),r-t[l(x)].sz-);
  44. }
  45. int dfs(int L,int R,int k) {
  46. if(L==R) return L; int s=;
  47. for(int i=;i<=tp;i++) s+=t2[L(st[i])].x;
  48. for(int i=;i<=tp2;i++) if(st2[i]<=M&&st2[i]>=L) s++;
  49. if(s>=k) {
  50. for(int i=;i<=tp;i++) st[i]=L(st[i]);
  51. return dfs(L,M,k);
  52. } else {
  53. for(int i=;i<=tp;i++) st[i]=R(st[i]);
  54. return dfs(M+,R,k-s);
  55. }
  56. }
  57. int qr(int l,int r,int k) {tp=tp2=,gt(rt,l,r); return dfs(,N,k);}
  58. void gai(int x,int p,int v) {
  59. if(t[l(x)].sz+==p) V=t[x].v,t[x].v=v; else if(t[l(x)].sz>=p) gai(l(x),p,v); else gai(r(x),p-t[l(x)].sz-,v);
  60. upd(t[x].x,,N,v,),upd(t[x].x,,N,V,-);
  61. }
  62.  
  63. int main() {
  64. for(int i=;i<N*;i++) rb[i]=i;
  65. for(int i=;i<N*;i++) rb2[i]=i;
  66. scanf("%d",&n),tt=N*-,t1=N*-;
  67. for(int i=;i<=n;i++) scanf("%d",&x),ins(rt,i,x+);
  68. scanf("%d",&q);
  69. while(q--) {
  70. scanf("%s%d%d",op,&x,&y),x^=la,y^=la;
  71. if(op[]=='Q') scanf("%d",&z),printf("%d\n",la=qr(x,y,z^la)-);
  72. else if(op[]=='I') ins(rt,x,y+);
  73. else gai(rt,x,y+);
  74. }
  75. return ;
  76. }

BZOJ3065(替罪羊树套线段树)的更多相关文章

  1. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  2. ZJOI 2017 树状数组(线段树套线段树)

    题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...

  3. BZOJ4317Atm的树&BZOJ2051A Problem For Fun&BZOJ2117[2010国家集训队]Crash的旅游计划——二分答案+动态点分治(点分树套线段树/点分树+vector)

    题目描述 Atm有一段时间在虐qtree的题目,于是,他满脑子都是tree,tree,tree…… 于是,一天晚上他梦到自己被关在了一个有根树中,每条路径都有边权,一个神秘的声音告诉他,每个点到其他的 ...

  4. hdu-4819-线段树套线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=4819 给出一个N*N的矩阵,每次询问一个m*m的子矩阵里的floor((maxv+minv)/2)并把中间的元素 ...

  5. dfs序+主席树 或者 树链剖分+主席树(没写) 或者 线段树套线段树 或者 线段树套splay 或者 线段树套树状数组 bzoj 4448

    4448: [Scoi2015]情报传递 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 588  Solved: 308[Submit][Status ...

  6. 【vijos】1750 建房子(线段树套线段树+前缀和)

    https://vijos.org/p/1750 是不是我想复杂了.... 自己yy了个二维线段树,然后愉快的敲打. 但是wa了两法.......sad 原因是在处理第二维的更新出现了个小问题,sad ...

  7. [TJOI2017][bzoj4889] 不勤劳的图书管理员 [线段树套线段树]

    题面 传送门 思路 考虑两本书的位置交换对答案的贡献: (为了方便描述,用"左边那本"和"右边那本"称呼两本我们要交换的书,"中间那本"是我 ...

  8. 【bzoj4785】[Zjoi2017]树状数组 线段树套线段树

    题目描述 漆黑的晚上,九条可怜躺在床上辗转反侧.难以入眠的她想起了若干年前她的一次悲惨的OI 比赛经历.那是一道基础的树状数组题.给出一个长度为 n 的数组 A,初始值都为 0,接下来进行 m 次操作 ...

  9. BZOJ1901 ZOJ2112 线段树+treap (线段树套线段树)

    BZOJ1901: 线段树套线段树做法: (外层线段树 里层动态开节点的权值线段树) 有一个小小的trick 可以省掉二分变成nlog^2n的 就是把查询的区间都取出来- logn个一起走- 2016 ...

  10. [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树)

    [BZOJ 3110] [luogu 3332] [ZJOI 2013]k大数查询(权值线段树套线段树) 题面 原题面有点歧义,不过从样例可以看出来真正的意思 有n个位置,每个位置可以看做一个集合. ...

随机推荐

  1. 关于jvm的OutOfMemory:PermGen space异常的解决

    在做网校的时候,经常会在控制台会报出方法区的内存溢出,在网上找的方法,无非都是在tomcat的bin/catalina.bat文件中 设置jvm的堆的大小和方法区的大小,但是通过eclipse启动to ...

  2. CSS <input type="file">样式设置

    这是最终想要的效果~~~ 实现很简单,div设置背景图片,<input type="file"/>绝对定位上去再设置opacity:0(透明度为0 ) 直接上代码,希望 ...

  3. Python之旅.第四章.模块与包.总结(未完待遇)

    一.模块 模块: 一系列功能的集合体,在python中一个py文件就是一个模块,模块名就是py文件的文件名: 模块的好处: 1.减少重复的代码 2.拿来主义 定义模块: 就是创建一个py文件: 使用模 ...

  4. js window

    window对象: browser object mode :bom对象. bom提供了独立于内容而与浏览器窗口进行交互的对象. bom主要用于管理窗口与窗口之间的通讯,因此其核心对象是window ...

  5. Python内置函数(36)——reversed

    英文文档: reversed(seq) Return a reverse iterator. seq must be an object which has a __reversed__() meth ...

  6. spring MVC框架入门(外加SSM整合)

    spring MVC框架 一.什么是sping MVC Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 W ...

  7. Spring AOP AspectJ

    本文讲述使用AspectJ框架实现Spring AOP. 再重复一下Spring AOP中的三个概念, Advice:向程序内部注入的代码. Pointcut:注入Advice的位置,切入点,一般为某 ...

  8. 百度播放器SDK 播放MP4格式视频有声音无画面问题解决

    此处为记录解决过程. 所链接使用的MP4格式视频为codec id是mp4v-20.使用手机自带播放器可以播放,使用百度云媒体播放器不能无画面.经调试,Android Baidu-Cloud-Play ...

  9. Mysql官方文档翻译系列14.18--MySql备份与恢复

    原文链接: (https://dev.mysql.com/doc/refman/5.7/en/innodb-backup-recovery.html) The key to safe database ...

  10. spark2.1:使用df.select(when(a===b,1).otherwise(0))替换(case when a==b then 1 else 0 end)

    最近工作中把一些sql.sh脚本执行hive的语句升级为spark2.1版本,其中遇到将case when 替换为scala操作df的方式实现的问题: 代码数据: scala> import o ...