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


题目传送门 - BZOJ2209


题解

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

  题解懒得写了。

  给一个链接:

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


代码

#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=100005;
int fa[N],son[N][2],rev1[N],rev2[N],root;
int Lmin[N],Lmax[N],Rmin[N],Rmax[N],sum[N],val[N],size[N];
void pushup(int x){int ls=son[x][0],rs=son[x][1];sum[x]=sum[ls]+val[x]+sum[rs];size[x]=size[ls]+size[rs]+1;Lmin[x]=min(Lmin[ls],sum[ls]+val[x]+Lmin[rs]);Lmax[x]=max(Lmax[ls],sum[ls]+val[x]+Lmax[rs]);Rmin[x]=min(Rmin[rs],sum[rs]+val[x]+Rmin[ls]);Rmax[x]=max(Rmax[rs],sum[rs]+val[x]+Rmax[ls]);
}
int build(int pre,int L,int R){if (L>R)return 0;int mid=(L+R)>>1;fa[mid]=pre;if (L==R){Lmin[mid]=Rmin[mid]=Lmax[mid]=Rmax[mid]=0;sum[mid]=val[mid],size[mid]=1;if (val[mid]<0)Lmin[mid]=Rmin[mid]=-1;if (val[mid]>0)Lmax[mid]=Rmax[mid]=1;return mid;}son[mid][0]=build(mid,L,mid-1);son[mid][1]=build(mid,mid+1,R);pushup(mid);return mid;
}
void pushson(int x,int r1,int r2){if (!x)return;if (r1){rev1[x]^=1;swap(Lmin[x],Lmax[x]),Lmin[x]=-Lmin[x],Lmax[x]=-Lmax[x];swap(Rmin[x],Rmax[x]),Rmin[x]=-Rmin[x],Rmax[x]=-Rmax[x];sum[x]=-sum[x];val[x]=-val[x];}if (r2){rev2[x]^=1;swap(Lmin[x],Rmin[x]);swap(Lmax[x],Rmax[x]);swap(son[x][0],son[x][1]);}
}
void pushdown(int x){int &ls=son[x][0],&rs=son[x][1],&r1=rev1[x],&r2=rev2[x];pushson(ls,r1,r2);pushson(rs,r1,r2);r1=r2=0;
}
void pushadd(int x){if (fa[x])pushadd(fa[x]);pushdown(x);
}
int wson(int x){return son[fa[x]][1]==x;
}
void rotate(int x){if (!fa[x])return;int y=fa[x],z=fa[y],L=wson(x),R=L^1;if (z)son[z][wson(y)]=x;fa[x]=z,fa[y]=x,fa[son[x][R]]=y;son[y][L]=son[x][R],son[x][R]=y;pushup(y),pushup(x);
}
void splay(int x,int rt){if (!x)return;if (!rt)root=x;pushadd(x);for (int y=fa[x];fa[x]!=rt;rotate(x),y=fa[x])if (fa[y]!=rt)rotate(wson(x)==wson(y)?y:x);
}
int findkth(int x,int k){pushdown(x);if (size[son[x][0]]+1==k)return x;if (k<=size[son[x][0]])return findkth(son[x][0],k);elsereturn findkth(son[x][1],k-size[son[x][0]]-1);
}
int n,m;
char str[N];
int main(){scanf("%d%d%s",&n,&m,str+2);memset(val,0,sizeof val);for (int i=2;i<=n+1;i++)val[i]=str[i]=='('?1:-1;root=build(0,1,n+2);for (int i=1;i<=m;i++){int op,x,y;scanf("%d%d%d",&op,&x,&y);x=findkth(root,x),y=findkth(root,y+2);splay(x,0);splay(y,x);int z=son[y][0];if (op==0)printf("%d\n",(Rmax[z]+1)/2-(Lmin[z]-1)/2);if (op==1)pushson(z,1,0);if (op==2)pushson(z,0,1);}return 0;
}

  

转载于:https://www.cnblogs.com/zhouzhendong/p/BZOJ2209.html

BZOJ2209 [Jsoi2011]括号序列 splay相关推荐

  1. BZOJ2209: [Jsoi2011]括号序列

    BZOJ2209: [Jsoi2011]括号序列 Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. ...

  2. BZOJ2209 [Jsoi2011]括号序列

    一个括号序列将合法括号都去掉后将剩下左边一堆右括号和右边一堆左括号,这个括号序列变合法需要的步数就是(左括号数量+1)/2下取整加上(右括号数量+1)/2下取整 拿splay同时维护翻转标记和取反标记 ...

  3. BZOJ 2209 [Jsoi2011] 括号序列

    Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的 ...

  4. UOJ#31. 【UR #2】猪猪侠再战括号序列 splay

    显然可以直接凑左面全是左括号,右面全是右括号的情况. 然后区间翻转就用 splay 模拟好了. splay 的时候一定注意一点: 如果没有调用 find(x),就一定要手动把 x 及其祖先的节点 pu ...

  5. UOJ #31 【UR #2】猪猪侠再战括号序列

    大家好我是来自百度贴吧的_叫我猪猪侠,英文名叫_CallMeGGBond. 我不曾上过大学,但这不影响我对离散数学.复杂性分析等领域的兴趣:尤其是括号序列理论,一度令我沉浸其中,无法自拔.至于OI算法 ...

  6. 【UR #2】猪猪侠再战括号序列

    ---恢复内容开始--- 大概就是判断合法的括号序列的问题,进行翻转使其成为合法的括号序列. 1.前缀和的做法:非常妙啊,左括号和右括号分别即为1和-1,合法的组合累加和一定为非负数,而不合法的情况就 ...

  7. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  8. 2016百度实习编程题:括号序列

    不知如何解决 1.感觉贪心或者动态规划,不知道如何解决 2.做过生成合法括号序列的题目,想到用DFS补成合法的括号,然而没有成功

  9. UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)

    整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...

最新文章

  1. UIAlertAction的用法
  2. 论文阅读(1)--Fine-grained Image Classification by Exploring Bipartite-Graph Labels
  3. springboot系列——redisTemplate和stringRedisTemplate对比、redisTemplate几种序列化方式比较
  4. ajax-loader.gif不存在怎么解决_高温下水泥路面材料膨胀路面上出现裂缝怎么处理?...
  5. Linux下测试PHP和MySQL是否正确安装
  6. MikroTik RouterOS使用U盘安装提示FATAL ERROR: no CD-ROM found Press ENTER to reboot的问题解决...
  7. 从Linux基础到k8s进阶,马哥_K8s进阶实战(11)Kubernetes系统扩展
  8. roseMirrorHA5.0 for WindowsServer2008R2配合sqlserver2012|Oracle 11g的安装和配置
  9. 第九章 搭建Hadoop 2.2.0版本HDFS的HA配置
  10. 小甲鱼python学习笔记之函数(一)
  11. wxFormBuilder + wxPython手撸丑陋计算器
  12. python如何调用函数计算出成绩的不及格率_pytorch中的学习率调整函数
  13. 苹果保修期查询_保修期还有6个月的IPhone X 换个“新”主板变“过保”了 维修点这样回应...
  14. 应届毕业生求职,注意事项
  15. linux上使用FTP下载远程PTF远程文件
  16. 微信小程序实现一键返回顶部
  17. 【它山之玉】在高校工作和抓紧时间- 科学网马臻
  18. Unity3dMVC框架编程核心思想
  19. 【产品经理】产品体验报告准备
  20. 记一次ES整合logstash所遇的坑

热门文章

  1. 输入5个整数,找出5个数中的两位数
  2. 30多岁的男人是创业,还是选择找个踏实的工作?
  3. 长痘痘了吃什么好得快?
  4. 有哪些不怎么火,实际上却很厉害的软件
  5. 浏览网页时,手机显示手机被恶意攻击,不停震动,一直弹出应用要我下载,有没有问题?
  6. 为什么同样是200M宽带,移动可以不要钱,联通却要1000多?
  7. Qt4_改变形状的对话框
  8. html列自动变高,HTML 应用 多列浮动等高处理
  9. mysql 查询最顶级_2018顶级MySQL博客作者
  10. SQL Server数据库连续集成(CI)最佳实践以及如何实现它们–测试,处理和自动化