链接

https://www.lydsy.com/JudgeOnline/problem.php?id=1251

思路

好简单的模板题

不过还是wrong了好几发

叶子节点要注意下,不能使用

遇到就不管

写的fhq-treap,OI中常数最大的平衡树,中间还T了一发

代码

  1. #include <iostream>
  2. #include <ctime>
  3. #include <cstdlib>
  4. #include <cstdio>
  5. using namespace std;
  6. const int N=5e5+7;
  7. int read() {
  8. int x=0,f=1;char s=getchar();
  9. for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
  10. for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
  11. return x*f;
  12. }
  13. int n,m;
  14. int ch[N][2],val[N],pri[N],siz[N],ma[N],tag_1[N],tag_2[N];
  15. int max(int a,int b) {
  16. return a>b?a:b;
  17. }
  18. void work1(int rt) {
  19. if(!rt) return;
  20. swap(ch[rt][0],ch[rt][1]);
  21. tag_1[rt]^=1;
  22. }
  23. void work2(int rt,int k) {
  24. if(!rt) return;
  25. val[rt]+=k;
  26. ma[rt]+=k;
  27. tag_2[rt]+=k;
  28. }
  29. void pushdown(int rt) {
  30. if(tag_1[rt]) {
  31. work1(ch[rt][0]);
  32. work1(ch[rt][1]);
  33. tag_1[rt]=0;
  34. }
  35. if(tag_2[rt]) {
  36. work2(ch[rt][0],tag_2[rt]);
  37. work2(ch[rt][1],tag_2[rt]);
  38. tag_2[rt]=0;
  39. }
  40. }
  41. void pushup(int rt) {
  42. ma[rt]=max(val[rt],max(ma[ch[rt][0]],ma[ch[rt][1]]));
  43. siz[rt]=siz[ch[rt][0]]+siz[ch[rt][1]]+1;
  44. }
  45. int cnt;
  46. int build(int l,int r) {
  47. if(l>r) return 0;
  48. int mid=(l+r)>>1,p=++cnt;
  49. ma[p]=val[p]=0,pri[p]=rand(),siz[p]=1;
  50. ch[p][0]=build(l,mid-1);
  51. ch[p][1]=build(mid+1,r);
  52. if(!ch[p][0]) ma[ch[p][0]]=-0x3f3f3f3f;
  53. if(!ch[p][1]) ma[ch[p][1]]=-0x3f3f3f3f;
  54. pushup(p);
  55. return p;
  56. }
  57. int merge(int x,int y) {
  58. pushdown(x),pushdown(y);
  59. if(!x||!y) return x+y;
  60. if(pri[x]<pri[y]) {
  61. ch[x][1]=merge(ch[x][1],y);
  62. pushup(x);
  63. return x;
  64. } else {
  65. ch[y][0]=merge(x,ch[y][0]);
  66. pushup(y);
  67. return y;
  68. }
  69. }
  70. void split(int now,int &x,int &y,int k) {
  71. if(!now) x=y=0;
  72. else {
  73. pushdown(now);
  74. if(siz[ch[now][0]]+1<=k)
  75. x=now,split(ch[now][1],ch[x][1],y,k-siz[ch[now][0]]-1);
  76. else
  77. y=now,split(ch[now][0],x,ch[y][0],k);
  78. pushup(now);
  79. }
  80. }
  81. void debug(int now ){
  82. pushdown(now);
  83. if(!now) return;
  84. debug(ch[now][0]);
  85. cout<<val[now]<<" ";
  86. debug(ch[now][1]);
  87. }
  88. int main() {
  89. n=read(),m=read();
  90. int rt=build(1,n);
  91. for(int i=1;i<=m;++i) {
  92. int opt=read(),l=read(),r=read(),x,y,z;
  93. if(opt==1) {
  94. int v=read();
  95. split(rt,x,z,r);
  96. split(x,x,y,l-1);
  97. work2(y,v);
  98. rt=merge(merge(x,y),z);
  99. }
  100. else if(opt==2) {
  101. split(rt,x,z,r);
  102. split(x,x,y,l-1);
  103. work1(y);
  104. rt=merge(merge(x,y),z);
  105. } else {
  106. split(rt,x,z,r);
  107. split(x,x,y,l-1);
  108. printf("%d\n",ma[y]);
  109. rt=merge(merge(x,y),z);
  110. }
  111. // debug(rt);puts("");
  112. }
  113. return 0;
  114. }
  115. /*
  116. 10 3
  117. 1 3 9 -5705
  118. 2 2 6
  119. 3 7 8
  120. */

bzoj 1251: 序列终结者 平衡树,fhqtreap的更多相关文章

  1. BZOJ 1251 序列终结者(Splay)

    题目大意 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这样的,真是没技术 ...

  2. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  3. BZOJ 1251: 序列终结者

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 3773  Solved: 1579 [Submit][Status][Dis ...

  4. bzoj 1251序列终结者 splay 区间翻转,最值,区间更新

    序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4594  Solved: 1939[Submit][Status][Discuss] De ...

  5. 【BZOJ】1251: 序列终结者(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1251 不行..为什么写个splay老是犯逗,这次又是null的mx没有赋值-maxlongint.. ...

  6. 1251. 序列终结者【平衡树-splay】

    Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我们这里的某人,出模拟试题,居然还出了一道这 ...

  7. 【BZOJ】1251: 序列终结者

    [题意]给定含有n个0的的数列. 1.区间加值 2.区间翻转 3.区间求最大值 [算法]平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx ...

  8. 【bzoj1251】序列终结者(伸展树)

    [bzoj1251]序列终结者(伸展树) Description 网上有许多题,就是给定一个序列,要你支持几种操作:A.B.C.D.一看另一道题,又是一个序列 要支持几种操作:D.C.B.A.尤其是我 ...

  9. 【BZOJ】【1251】序列终结者

    Splay 还是splay序列维护,这题我WA了的原因是:在Push_up的时候,当前子树的max我是直接取的L.R和v[x]的最大值,但是如果没有左/右儿子,默认是会访问0号结点的mx值,而这个值没 ...

随机推荐

  1. why big data

    很多人都知道大数据很火,就业很好,薪资很高,想往大数据方向发展.但该学哪些技术,学习路线是什么样的呢?用不用参加大数据培训呢?如果自己很迷茫,为了这些原因想往大数据方向发展,也可以,那么大讲台老师就想 ...

  2. Vue系列之 => 通过vue-resource发起ajax请求

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. linux 命令杂集

    [1]查找日志中某个字符串XXXX tail -f  日志文件名 |  grep  "XXXX" [2]linux抓包命令 tcpdump -i XXX -A  ip xxx.xx ...

  4. python3安装scrapy教程

    2.1xm1http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml3. PyOpensslhttps://pypi.python.org/pypi/pyOpen ...

  5. CRM rbac 组件的应用

    1 拷贝 rbac 组件到项目中,注册这个app 2 数据库迁移 1 删除rbac下migrations里除了init外的文件 2 修改用户表 class User(models.Model): &q ...

  6. node.js核心技术

    一.知识结构: http模块:配置简单 的web服务,npm/cnpm工具 express框架:express中间件进行服务配置:路由:请求处理: DB服务:学习使用mysql关系型数据库: web接 ...

  7. 51Nod 1433 0和5

    小K手中有n张牌,每张牌上有一个一位数的数,这个字数不是0就是5.小K从这些牌在抽出任意张(不能抽0张),排成一行这样就组成了一个数.使得这个数尽可能大,而且可以被90整除. 注意: 1.这个数没有前 ...

  8. echarts遇到的问题

    X轴无偏移: axisTick: { alignWithLabel: true }, x轴显示所有数据项且避免拥挤在xAxis设置: axisLabel: { interval: 0, rotate: ...

  9. Java 持久化操作之 --XML

    摘自:http://www.cnblogs.com/lsy131479/p/8728767.html 1)有关XML简介 XML(EXtensible Markup Language)可扩展标记语言 ...

  10. ora-904 rowid create materialized view

    create materialized view t_v asselect t1.*,1 as marker,rowid from t1 t1union allselect t2.*,2 as mar ...