题链:

Splay
很好的题,但是把智障的我给恶心到了。。。
 
首先不难发现,最后没有匹配的括号的样子一定是 ))))..((((...
即左边是右括号(设个数为nr),右边是做括号(设个数为nl)
则答案为 ⌈nl÷2⌉ + ⌈nr÷2⌉ (⌈ ⌉:向上取整)
 
若把 '(' 看成 1,把 ')' 看成 -1,
那么在这个只含有 1 和 -1 的序列里,
前缀最小值的相反数就等于nr,
后缀最大值的就等于nl
 
所以对于询问操作来说,在Splay中记录:
key[x](节点x是 1 还是 -1)
sum[x](x子树对应区间的sum和)
pmn[x](x子树对应区间的前缀最小值),
smx[x](x子树对应区间的后缀最大值)。
 
对于第二个反转操作
可以看出,只是把对应区间的 1→ -1,-1→ 1,
所以再多维护两个东西
pmx[x](x子树对应区间的前缀最大值),
smn[x](x子树对应区间的后缀最小值)。
然后把记录的 key[x],sum[x],pmn[x],pmx[x],smn[x],smx[x]全部取反(都乘上-1),
并且 swap(pmn[x],pmx[x]), swap(smn[x],smx[x])(因为取反了啊~)
再打个lazy标记,就好啦。
 
对于第三个翻转操作
就只需交换左右子树,
并且 swap(pmx[x],smx[x]),swap(pmn[x],smn[x]) (只是把序列反了起来,所以交换前后缀信息即可)
然后打一个lazy标记。
 
因为lazy标记不存在先后影响,所以lazy下放时随便先放哪个都可以的。
 
代码:
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #define MAXN 100500
  5. using namespace std;
  6. int N,M;
  7. struct SPT{
  8. int pmx[MAXN],pmn[MAXN],smx[MAXN],smn[MAXN],sum[MAXN],key[MAXN];
  9. int ch[MAXN][2],siz[MAXN],fa[MAXN],lazy[MAXN],rt;
  10. void Reverse(int x){
  11. sum[x]*=-1; key[x]*=-1;
  12. pmx[x]*=-1; pmn[x]*=-1; swap(pmx[x],pmn[x]);
  13. smx[x]*=-1; smn[x]*=-1; swap(smx[x],smn[x]);
  14. }
  15. void Flip(int x){
  16. swap(pmx[x],smx[x]);
  17. swap(pmn[x],smn[x]);
  18. swap(ch[x][0],ch[x][1]);
  19. }
  20. void Pushup(int x){
  21. siz[x]=siz[ch[x][0]]+1+siz[ch[x][1]];
  22. sum[x]=sum[ch[x][0]]+key[x]+sum[ch[x][1]];
  23. pmx[x]=max(pmx[ch[x][0]],sum[ch[x][0]]+key[x]+pmx[ch[x][1]]);
  24. pmn[x]=min(pmn[ch[x][0]],sum[ch[x][0]]+key[x]+pmn[ch[x][1]]);
  25. smx[x]=max(smx[ch[x][1]],sum[ch[x][1]]+key[x]+smx[ch[x][0]]);
  26. smn[x]=min(smn[ch[x][1]],sum[ch[x][1]]+key[x]+smn[ch[x][0]]);
  27. }
  28. void Pushdown(int x){
  29. if(lazy[x]&1){
  30. Reverse(ch[x][0]); lazy[ch[x][0]]^=1;
  31. Reverse(ch[x][1]); lazy[ch[x][1]]^=1;
  32. lazy[x]^=1;
  33. }
  34. if(lazy[x]&2){
  35. Flip(ch[x][0]); lazy[ch[x][0]]^=2;
  36. Flip(ch[x][1]); lazy[ch[x][1]]^=2;
  37. lazy[x]^=2;
  38. }
  39. }
  40. void Rotate(int x,int &k){
  41. static int y,z,l,r;
  42. y=fa[x]; z=fa[y];
  43. l=ch[y][0]!=x; r=l^1;
  44. if(!z) k=x;
  45. else ch[z][ch[z][0]!=y]=x;
  46. fa[ch[x][r]]=y; fa[y]=x; fa[x]=z;
  47. ch[y][l]=ch[x][r]; ch[x][r]=y;
  48. Pushup(y);
  49. }
  50. void Splay(int x,int &k){
  51. static int y,z;
  52. while(x!=k){
  53. y=fa[x]; z=fa[y];
  54. if(y!=k) (ch[z][0]!=y)^(ch[y][0]!=x)?
  55. Rotate(x,k):Rotate(y,k);
  56. Rotate(x,k);
  57. }
  58. Pushup(x);
  59. }
  60. int find(int x,int num){
  61. if(lazy[x]) Pushdown(x);
  62. if(num<=siz[ch[x][0]]) return find(ch[x][0],num);
  63. else if(num==siz[ch[x][0]]+1) return x;
  64. else return find(ch[x][1],num-siz[ch[x][0]]-1);
  65. }
  66. int Split(int l,int r){
  67. static int dl,dr;
  68. dl=find(rt,l); dr=find(rt,r+2);
  69. Splay(dl,rt); Splay(dr,ch[dl][1]);
  70. return ch[dr][0];
  71. }
  72. void Modify(int l,int r,int type){
  73. static int p;
  74. p=Split(l,r);
  75. if(type==1) Reverse(p);
  76. else Flip(p);
  77. lazy[p]^=type;
  78. Pushup(fa[p]); Pushup(fa[fa[p]]);
  79. }
  80. void Build(int &x,int dad,int l,int r){
  81. static char c;
  82. if(l>r) return;
  83. x=(l+r)>>1; fa[x]=dad;
  84. Build(ch[x][0],x,l,x-1);
  85. scanf(" %c",&c); key[x]=(c=='('?1:-1);
  86. Build(ch[x][1],x,x+1,r);
  87. Pushup(x);
  88. }
  89. void BorderBuild(){
  90. rt=N+1;
  91. key[N+1]=0; key[N+2]=0;
  92. ch[N+1][1]=N+2; fa[N+2]=N+1;
  93. Build(ch[N+2][0],N+2,1,N);
  94. Pushup(N+2); Pushup(N+1);
  95. }
  96. int Query(int l,int r){
  97. static int p,ANS,nl,nr;
  98. p=Split(l,r);
  99. nl=-pmn[p]; nr=smx[p];
  100. ANS=(nl+1)/2+(nr+1)/2;
  101. return ANS;
  102. }
  103. }DT;
  104. int main(){
  105. freopen("/home/noilinux/Documents/模块学习/2209.in","r",stdin);
  106. scanf("%d%d",&N,&M);
  107. DT.BorderBuild();
  108. for(int i=1,c,l,r;i<=M;i++){
  109. scanf("%d%d%d",&c,&l,&r);
  110. if(c==0) printf("%d\n",DT.Query(l,r));
  111. else DT.Modify(l,r,c);
  112. }
  113. return 0;
  114. }

  

 

●BZOJ 2209 [Jsoi2011]括号序列的更多相关文章

  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. bzoj 2209 [Jsoi2011]括号序列 平衡树

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

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

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

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

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

  6. BZOJ2209: [Jsoi2011]括号序列

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

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

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

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

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

  9. BZOJ2209 [Jsoi2011]括号序列 splay

    原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...

随机推荐

  1. 201621123040《Java程序设计》第十四周学习总结

    1.本周学习总结 1.1以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 显示所有数据库: show databases; 创建数据库: create database test; 删除数据 ...

  2. 201621123040《Java程序设计》第六周学习总结

    1.本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图或相关笔记,对面向对象思想进行一个总结 2.书面作业 2.1clone方法 2.1.1在te ...

  3. [USACO13JAN] Seating

    https://www.luogu.org/problem/show?pid=3071 题目描述 To earn some extra money, the cows have opened a re ...

  4. Java看书学习笔记

    1.POM:maven ,项目管理工具存放Jar包的文件2.mybatis-generator-core-1.3.2 生成文件 生成语句: java -jar mybatis-generator-co ...

  5. mybatis的mapper接口代理使用的三个规范

    1.什么是mapper代理接口方式? MyBatis之mapper代理方式.mapper代理使用的是JDK的动态代理策略 2.使用mapper代理方式有什么好处 使用这种方式可以不用写接口的实现类,免 ...

  6. 网络IO超时的几种实现

    一.select/poll/epoll int select(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset,str ...

  7. Spring知识点回顾(07)事件发布和监听

    Spring知识点回顾(07)事件发布和监听 1.DemoEvent extends ApplicationEvent { public DemoEvent(Object source, String ...

  8. 使用jQuery获取session中存储的list集合

    在网上查找了很多关于jQuery获取session都不可得,如果大家有更好的方式,欢迎留言 这里是使用jQuery发送Ajax请求到后台获取session jsp中没有代码 js代码 <scri ...

  9. 百度资深架构师带你深入浅出一致性Hash原理

    一.前言 在解决分布式系统中负载均衡的问题时候可以使用Hash算法让固定的一部分请求落到同一台服务器上,这样每台服务器固定处理一部分请求(并维护这些请求的信息),起到负载均衡的作用. 但是普通的余数h ...

  10. 推荐几个IDEA插件,Java开发者撸码利器。

    这里只是推荐一下好用的插件,具体的使用方法不一一详细介绍. JRebel for IntelliJ 一款热部署插件,只要不是修改了项目的配置文件,用它都可以实现热部署.收费的,破解比较麻烦.不过功能确 ...