fhqtreap的写法 操作其实都差不多哇

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int M=;
  6. int read(){
  7. int ans=,f=,c=getchar();
  8. while(c<''||c>''){if(c=='-') f=-; c=getchar();}
  9. while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
  10. return ans*f;
  11. }
  12. int n,m,sum;
  13. struct node{
  14. node *l,*r;
  15. int sz,v,rnd,rev,tag,mn;
  16. void init(int w){sz=; v=w; rnd=rand(); mn=w;}
  17. void add(int w){tag+=w; v+=w; mn+=w;}
  18. void revs(){rev^=; swap(l,r);}
  19. void up(){
  20. sz=; mn=v;
  21. if(l) sz+=l->sz,mn=min(mn,l->mn);
  22. if(r) sz+=r->sz,mn=min(mn,r->mn);
  23. }
  24. void dn(){
  25. if(rev){if(l) l->revs(); if(r) r->revs(); rev=;}
  26. if(tag){if(l) l->add(tag); if(r) r->add(tag); tag=;}
  27. }
  28. void split(node*&lw,node*&rw,int k){
  29. if(!this){lw=; rw=; return ;}
  30. dn();
  31. int ls=l?l->sz:;
  32. if(ls>=k){
  33. l->split(lw,l,k);
  34. rw=this;
  35. }
  36. else{
  37. r->split(r,rw,k-ls-);
  38. lw=this;
  39. }
  40. up();
  41. }
  42. }tr[M],*rt;
  43. node *merge(node *a,node *b){
  44. if(!a) return b;
  45. if(!b) return a;
  46. if(a->rnd>b->rnd){
  47. a->dn();
  48. a->r=merge(a->r,b);
  49. a->up();
  50. return a;
  51. }{
  52. b->dn();
  53. b->l=merge(a,b->l);
  54. b->up();
  55. return b;
  56. }
  57. }
  58. int main()
  59. {
  60. int l,r,w;
  61. char ch[];
  62. n=read();
  63. for(int i=;i<=n;i++) w=read(),tr[i].init(w),rt=merge(rt,tr+i);
  64. sum=n; m=read();
  65. while(m--){
  66. scanf("%s",ch);
  67. if(ch[]=='A'){
  68. node *p1,*p2,*p3;
  69. l=read(); r=read(); w=read();
  70. rt->split(p2,p3,r);
  71. p2->split(p1,p2,l-);
  72. p2->add(w);
  73. rt=merge(merge(p1,p2),p3);
  74. }
  75. else if(ch[]=='M'){
  76. node *p1,*p2,*p3;
  77. l=read(); r=read();
  78. rt->split(p2,p3,r);
  79. p2->split(p1,p2,l-);
  80. printf("%d\n",p2->mn);
  81. rt=merge(merge(p1,p2),p3);
  82. }
  83. else if(ch[]=='R'&&ch[]=='R'){
  84. node *p1,*p2,*p3;
  85. l=read(); r=read();
  86. if(l==r) continue;
  87. rt->split(p2,p3,r);
  88. p2->split(p1,p2,l-);
  89. p2->revs();
  90. rt=merge(merge(p1,p2),p3);
  91. }
  92. else if(ch[]=='O'){
  93. node *p1,*p2,*p3,*p4;
  94. l=read(); r=read(); w=read()%(r-l+);
  95. if(l==r) continue;
  96. rt->split(p2,p4,r);
  97. p2->split(p1,p2,l-);
  98. p2->split(p2,p3,r-w-l+);
  99. rt=merge(merge(p1,p3),merge(p2,p4));
  100. }
  101. else if(ch[]=='I'){
  102. node *p1,*p2;
  103. l=read(); w=read();
  104. tr[++sum].init(w);
  105. rt->split(p1,p2,l);
  106. rt=merge(merge(p1,tr+sum),p2);
  107. }
  108. else if(ch[]=='D'){
  109. node *p1,*p2,*p3;
  110. l=read();
  111. rt->split(p2,p3,l);
  112. p2->split(p1,p2,l-);
  113. rt=merge(p1,p3);
  114. }
  115. }
  116. return ;
  117. }

poj3580 序列之王 fhqtreap的更多相关文章

  1. 洛谷 P3215 [HNOI2011]括号修复 / [JSOI2011]括号序列(fhq-treap)

    题目链接 题意:有一个长度为 \(n\) 的括号序列,你需要支持以下操作: 将 \([l,r]\) 中所有括号变为 \(c\) 将 \([l,r]\) 区间翻转 将 \([l,r]\) 区间中左括号变 ...

  2. bzoj1251: 序列终结者 fhqtreap写法

    fhqtreap的速度果然很快 花了时间学了下指针写法 没有旋转 只有分裂以及合并操作 其实还是蛮好写的 #include<cstdio> #include<cstring> ...

  3. Splay 的区间操作

    学完Splay的查找作用,发现和普通的二叉查找树没什么区别,只是用了splay操作节省了时间开支. 而Splay序列之王的称号可不是白给的. Splay真正强大的地方是他的区间操作. 怎么实现呢? 我 ...

  4. Splay平衡树入门小结

    学习到这部分算是数据结构比较难的部分了,平衡树不好理解代码量大,但在某些情况下确实是不可替代的,所以还是非学不可. 建议先学Treap之后在学Splay,因为其实Splay有不少操作和Treap差不多 ...

  5. Splay浅谈

    Splay是众多平衡树之一,它的功能十分强大,但常数极大.在LCT和许多数据结构中都能用到. Splay的核心操作,就是rotate.为了使树不是一条链,而是平衡的,我们需要旋转来维护形态.理论很简单 ...

  6. [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)

    普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...

  7. 【FHQ-Treap】P4146 序列终结者

    题意: 给定一个序列,支持区间加,区间反转,区间max询问 裸的平衡树题,这里采用FHQ-Treap 每个节点多记录一个max值和两个lazy_tag,暴力Push_Down即可(大常数选手) 打完这 ...

  8. bzoj 1251: 序列终结者 平衡树,fhqtreap

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1251 思路 好简单的模板题 不过还是wrong了好几发 叶子节点要注意下,不能使用 遇到就不 ...

  9. Poj3580 Super Memo(FHQ-Treap)

    题面 题解 对于操作$1$,我们可以对于每个节点打一个$add$标记,下放就行了 对于操作2,可以参考这篇题解的上一篇,不赘述 对于操作4,可以将区间裂成两部分,然后再插入合并 对于操作5,可以将区间 ...

随机推荐

  1. 【个人训练】(UVa11129)An antiarithmetic permutation

    题意与解析 一条非常有趣的二分题.一开始没有懂解法,去网上看了半天全是做法没有这样做为什么是对的(或者说的很含糊).一做完回顾一下立刻有点开朗的感觉. 题意很简单,维护一个0-n-1的数列,使其选出长 ...

  2. 【题解搬运】PAT_A1016 Phone Bills

    从我原来的博客上搬运.原先blog作废. 题目 A long-distance telephone company charges its customers by the following rul ...

  3. ubuntu 把软件源修改为国内源

    国内有很多Ubuntu的镜像源,比如:阿里源.网易源等,还有很多教育网的源,比如:清华源.中科大源等. 这里以清华源为例讲解如何修改Ubuntu 18.04里面默认的源. 修改步骤 第一步:备份原始源 ...

  4. tensorflow的几种优化器

    最近自己用CNN跑了下MINIST,准确率很低(迭代过程中),跑了几个epoch,我就直接stop了,感觉哪有问题,随即排查了下,同时查阅了网上其他人的blog,并没有发现什么问题 之后copy了一篇 ...

  5. PHP中的6种加密方式

    PHP中的6种加密方式 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. raw ...

  6. RMQ问题+ST算法

    一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大 ...

  7. eclipse版本命名规则与其他软件命名

    文章:Eclipse各版本代号一览表 eclipse使用星球.神话人物.元素名称作为命名代号. 所以思路要放宽,不要拘泥于已有经验. java是用咖啡命名的: python中文意思是蟒蛇: 不拘泥于已 ...

  8. HashMap和Hashtable的区别(转载)

    转载声明:转载自原文http://www.importnew.com/7010.html HashMap和Hashtable的比较是Java面试中的常见问题,用来考验程序员是否能够正确使用集合类以及是 ...

  9. 【SSH】——Hibernate三种状态之间的转化

    Hibernate的三种状态为:transient.persistent和detached.对这三种状态的理解可以结合Session缓存,在Session缓存中的状态为persistent,另外两种不 ...

  10. ES 1.7安装ik分词elasticsearch-analysis-ik-1.2.5

    IK简介 https://www.cnblogs.com/yjf512/p/4789239.html https://www.cnblogs.com/xing901022/p/5910139.html ...