原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html


题目传送门 - BZOJ2209


题解

  我太弱了,调出这题感觉都要吐了。

  题解懒得写了。

  给一个链接:

  http://blog.csdn.net/lych_cys/article/details/50700277


代码

  1. #include <cstring>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <cmath>
  6. using namespace std;
  7. const int N=100005;
  8. int fa[N],son[N][2],rev1[N],rev2[N],root;
  9. int Lmin[N],Lmax[N],Rmin[N],Rmax[N],sum[N],val[N],size[N];
  10. void pushup(int x){
  11. int ls=son[x][0],rs=son[x][1];
  12. sum[x]=sum[ls]+val[x]+sum[rs];
  13. size[x]=size[ls]+size[rs]+1;
  14. Lmin[x]=min(Lmin[ls],sum[ls]+val[x]+Lmin[rs]);
  15. Lmax[x]=max(Lmax[ls],sum[ls]+val[x]+Lmax[rs]);
  16. Rmin[x]=min(Rmin[rs],sum[rs]+val[x]+Rmin[ls]);
  17. Rmax[x]=max(Rmax[rs],sum[rs]+val[x]+Rmax[ls]);
  18. }
  19. int build(int pre,int L,int R){
  20. if (L>R)
  21. return 0;
  22. int mid=(L+R)>>1;
  23. fa[mid]=pre;
  24. if (L==R){
  25. Lmin[mid]=Rmin[mid]=Lmax[mid]=Rmax[mid]=0;
  26. sum[mid]=val[mid],size[mid]=1;
  27. if (val[mid]<0)
  28. Lmin[mid]=Rmin[mid]=-1;
  29. if (val[mid]>0)
  30. Lmax[mid]=Rmax[mid]=1;
  31. return mid;
  32. }
  33. son[mid][0]=build(mid,L,mid-1);
  34. son[mid][1]=build(mid,mid+1,R);
  35. pushup(mid);
  36. return mid;
  37. }
  38. void pushson(int x,int r1,int r2){
  39. if (!x)
  40. return;
  41. if (r1){
  42. rev1[x]^=1;
  43. swap(Lmin[x],Lmax[x]),Lmin[x]=-Lmin[x],Lmax[x]=-Lmax[x];
  44. swap(Rmin[x],Rmax[x]),Rmin[x]=-Rmin[x],Rmax[x]=-Rmax[x];
  45. sum[x]=-sum[x];
  46. val[x]=-val[x];
  47. }
  48. if (r2){
  49. rev2[x]^=1;
  50. swap(Lmin[x],Rmin[x]);
  51. swap(Lmax[x],Rmax[x]);
  52. swap(son[x][0],son[x][1]);
  53. }
  54. }
  55. void pushdown(int x){
  56. int &ls=son[x][0],&rs=son[x][1],&r1=rev1[x],&r2=rev2[x];
  57. pushson(ls,r1,r2);
  58. pushson(rs,r1,r2);
  59. r1=r2=0;
  60. }
  61. void pushadd(int x){
  62. if (fa[x])
  63. pushadd(fa[x]);
  64. pushdown(x);
  65. }
  66. int wson(int x){
  67. return son[fa[x]][1]==x;
  68. }
  69. void rotate(int x){
  70. if (!fa[x])
  71. return;
  72. int y=fa[x],z=fa[y],L=wson(x),R=L^1;
  73. if (z)
  74. son[z][wson(y)]=x;
  75. fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
  76. son[y][L]=son[x][R],son[x][R]=y;
  77. pushup(y),pushup(x);
  78. }
  79. void splay(int x,int rt){
  80. if (!x)
  81. return;
  82. if (!rt)
  83. root=x;
  84. pushadd(x);
  85. for (int y=fa[x];fa[x]!=rt;rotate(x),y=fa[x])
  86. if (fa[y]!=rt)
  87. rotate(wson(x)==wson(y)?y:x);
  88. }
  89. int findkth(int x,int k){
  90. pushdown(x);
  91. if (size[son[x][0]]+1==k)
  92. return x;
  93. if (k<=size[son[x][0]])
  94. return findkth(son[x][0],k);
  95. else
  96. return findkth(son[x][1],k-size[son[x][0]]-1);
  97. }
  98. int n,m;
  99. char str[N];
  100. int main(){
  101. scanf("%d%d%s",&n,&m,str+2);
  102. memset(val,0,sizeof val);
  103. for (int i=2;i<=n+1;i++)
  104. val[i]=str[i]=='('?1:-1;
  105. root=build(0,1,n+2);
  106. for (int i=1;i<=m;i++){
  107. int op,x,y;
  108. scanf("%d%d%d",&op,&x,&y);
  109. x=findkth(root,x),y=findkth(root,y+2);
  110. splay(x,0);
  111. splay(y,x);
  112. int z=son[y][0];
  113. if (op==0)
  114. printf("%d\n",(Rmax[z]+1)/2-(Lmin[z]-1)/2);
  115. if (op==1)
  116. pushson(z,1,0);
  117. if (op==2)
  118. pushson(z,0,1);
  119. }
  120. return 0;
  121. }

  

BZOJ2209 [Jsoi2011]括号序列 splay的更多相关文章

  1. bzoj 2209: [Jsoi2011]括号序列 splay

    2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 833  Solved: 392[Submit][Status ...

  2. BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]

    2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1111  Solved: 541[Submit][Statu ...

  3. 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay

    [BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...

  4. BZOJ2209: [Jsoi2011]括号序列

    传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1 ...

  5. bzoj 2209 [Jsoi2011]括号序列 平衡树

    2209: [Jsoi2011]括号序列 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1404  Solved: 699[Submit][Statu ...

  6. 【BZOJ】2209: [Jsoi2011]括号序列(splay)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...

  7. 【BZOJ-2329&2209】括号修复&括号序列 Splay

    2329: [HNOI2011]括号修复 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 476[Submit][Statu ...

  8. [BZOJ3786] 星系探索(括号序列+Splay)

    3786: 星系探索 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 2191  Solved: 644[Submit][Status][Discuss ...

  9. [HNOI2011]括号修复 / [JSOI2011]括号序列

    传送门 Solution 一道题花费了两天的时间-- 在大佬@PinkRabbit的帮助下,终于AC了,感动-- 首先,我们考虑一个括号序列被修改成合法序列需要的次数: 我们需要修改的其实是形如... ...

随机推荐

  1. 【原创】大数据基础之Benchmark(2)TPC-DS

    tpc 官方:http://www.tpc.org/ 一 简介 The TPC is a non-profit corporation founded to define transaction pr ...

  2. REST风格接口测试利器Wisdom rest-client

    前言 偶然间接触到Wisdom rest-client这款测试工具,后来经过尝试体验,感觉还不错,现在分享给大家,如何使用这款测试利器 Wisdom rest-client是什么? Wisdom re ...

  3. [C]变量作用域

    函数环境变量作用域 C语言栈环境变量作用域跟JS是类似的. 就是内部函数可以访问外部函数的执行(栈)环境变量. 当访问一个变量时,程序将会查询当前栈环境是否存在这个变量,如果没有,将会往上层栈环境继续 ...

  4. JNI 开发基础篇:Android开发中os文件的探索

    正题: android开发中,时长会遇到os文件的使用,那么os文件到底是什么?在这篇文章中会进行说明. .os文件在android中意味着C语言书写的方法,经android提供的ndk进行编译,从而 ...

  5. CDH运维

    1.单个节点宕机后,想可能存在的问题: 时间同步是否正常运行 hbase对时间是否同步很敏感 2.zookeeper报警 ZooKeeper 服务 canary 因未知原因失败. 该警报是在重启CM的 ...

  6. jQuery传参

    <a href="#" onClick="click_scroll('here1');">滚动到here1</a><a href= ...

  7. 从 Confluence 5.3 及其早期版本中恢复空间

    如果你需要从 Confluence 5.3 及其早期版本中的导出文件恢复到晚于 Confluence 5.3 的 Confluence 中的话.你可以使用临时的 Confluence 空间安装,然后将 ...

  8. 【python】内存相关

    1.  /proc/pid/status 可以查看进程相关的详细信息,当内存异常时可查看 参考:http://blog.csdn.net/beckdon/article/details/4849190 ...

  9. 使用react 在页面上引用静态图片,图片不显示

    const url='../assets/logo.png'; <img src={url} alt=''/> 1.使用require <img src={require('../a ...

  10. jQuery筛选器常用总结

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