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

题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作,还要维护左边有多少多余的左括号,右边有多少多余的右括号(如果一个右括号匹配一个左括号的话)。然后xjb维护一番即可。。。

答案是什么呢?$\lceil{左边多余的右括号数\over 2}\rceil+\lceil{右边多余的左括号数\over 2}\rceil$。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=100010;
int n,m,rt;
struct node
{
int v,f[2][2],ch[2],fa,siz,tag;
bool r1,r2;
}s[maxn];
char str[maxn];
//'('->0 ')'->1 r1->反 r2->翻
inline int ab(const int &a) {return a>0?a:0;}
inline void pushup(int x)
{
int l=s[x].ch[0],r=s[x].ch[1];
s[x].siz=s[l].siz+s[r].siz+1;
s[x].f[0][0]=s[l].f[0][0]+ab(s[r].f[0][0]-s[x].v-s[l].f[1][1]);
s[x].f[1][1]=s[r].f[1][1]+ab(s[l].f[1][1]+s[x].v-s[r].f[0][0]);
s[x].f[0][1]=s[l].f[0][1]+ab(s[r].f[0][1]+s[x].v-s[l].f[1][0]);
s[x].f[1][0]=s[r].f[1][0]+ab(s[l].f[1][0]-s[x].v-s[r].f[0][1]);
}
inline void rev1(int x)
{
s[x].tag=-s[x].tag,s[x].v=-s[x].v,s[x].r1^=1,swap(s[x].f[0][0],s[x].f[0][1]),swap(s[x].f[1][0],s[x].f[1][1]);
}
inline void rev2(int x)
{
s[x].r2^=1,swap(s[x].ch[0],s[x].ch[1]),swap(s[x].f[0][0],s[x].f[1][0]),swap(s[x].f[0][1],s[x].f[1][1]);
}
inline void cover(int x,int y)
{
s[x].tag=s[x].v=y,s[x].f[0][y>0]=s[x].f[1][y>0]=s[x].siz,s[x].f[0][y<0]=s[x].f[1][y<0]=0,s[x].r1=s[x].r2=0;
}
inline void pushdown(int x)
{
int l=s[x].ch[0],r=s[x].ch[1];
if(s[x].tag)
{
if(l) cover(l,s[x].tag);
if(r) cover(r,s[x].tag);
s[x].tag=0;
}
if(s[x].r1)
{
if(l) rev1(l);
if(r) rev1(r);
s[x].r1=0;
}
if(s[x].r2)
{
if(l) rev2(l);
if(r) rev2(r);
s[x].r2=0;
}
}
inline void rotate(int x,int &k)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(y!=k) s[z].ch[y==s[z].ch[1]]=x;
else k=x;
s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
inline void splay(int x,int &k)
{
while(x!=k)
{
int y=s[x].fa,z=s[y].fa;
if(y!=k)
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int x,int y)
{
if(!x) return 0;
pushdown(x);
if(s[s[x].ch[0]].siz>=y) return find(s[x].ch[0],y);
if(s[s[x].ch[0]].siz+1<y) return find(s[x].ch[1],y-s[s[x].ch[0]].siz-1);
return x;
}
inline void split(int a,int b)
{
splay(find(rt,a),rt),splay(find(rt,b+2),s[rt].ch[1]);
}
int build(int l,int r)
{
if(l>r) return 0;
int x=(l+r)>>1;
s[x].ch[0]=build(l,x-1),s[x].ch[1]=build(x+1,r);
if(s[x].ch[0]) s[s[x].ch[0]].fa=x;
if(s[x].ch[1]) s[s[x].ch[1]].fa=x;
pushup(x);
return x;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
//freopen("bz2329.in","r",stdin);
n=rd(),m=rd();
int i,a,b,x;
scanf("%s",str+1);
for(i=1;i<=n;i++) s[i+1].v=(str[i]=='(')?-1:1;
rt=build(1,n+2);
for(i=1;i<=m;i++)
{
scanf("%s",str),a=rd(),b=rd(),split(a,b),x=s[s[rt].ch[1]].ch[0];
if(str[0]=='R')
{
scanf("%s",str);
cover(x,(str[0]=='(')?-1:1),pushup(s[x].fa),pushup(s[s[x].fa].fa);
}
if(str[0]=='I') rev1(x),pushup(s[x].fa),pushup(s[s[x].fa].fa);
if(str[0]=='S') rev2(x),pushup(s[x].fa),pushup(s[s[x].fa].fa);
if(str[0]=='Q') printf("%d\n",((s[x].f[0][1]+1)>>1)+((s[x].f[1][0]+1)>>1));
}
return 0;
}//4 5 (((( Replace 1 2 ) Query 1 2 Swap 2 3 Invert 3 4 Query 1 4
//6 3 )(())( Q 1 6 Q 1 4 Q 3 4

【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2329 需要改变的括号序列一定长这样 :)))((( 最少改变次数= 多余的‘)’/2 [上取整] + ...

  8. BZOJ 2329/2209 [HNOI2011]括号修复 (splay)

    题目大意: 让你维护一个括号序列,支持 1.区间修改为同一种括号 2.区间内所有括号都反转 3.翻转整个区间,括号的方向不变 4.查询把某段区间变为合法的括号序列,至少需要修改多少次括号 给跪了,足足 ...

  9. BZOJ 2329: [HNOI2011]括号修复( splay )

    把括号序列后一定是))))((((这种形式的..所以维护一个最大前缀和l, 最大后缀和r就可以了..答案就是(l+1)/2+(r+1)/2...用splay维护,O(NlogN). 其实还是挺好写的, ...

随机推荐

  1. 联合主键用hibernate注解映射方式主要有三种:

    将联合主键的字段单独放在一个类中,该类需要实现java.io.Serializable接口并重写equals和hascode 第一.将该类注解为@Embeddable,最后在主类中(该类不包含联合主键 ...

  2. linux -- 进程管理和作业控制

    一. 作业控制 1. 直接将命令放到后台"执行": &  [root @test /root ]# command & 范例: [root @test /root] ...

  3. VMware下Ubuntu与宿主Windows共享文件夹 (转至 http://blog.csdn.net/zz962/article/details/7706755)

    概述 1.安装VMware Tool 2.设置共享 步骤 开始安装VMware Tool 显示如下画面(如果宿主无法访问外网,可能会出现一个更新失败,可以无视之) 通过下列命令解压.执行,分别是下面的 ...

  4. Python3的tcp socket接收不定长数据包接收到的数据不全。

    Python Socket API参考出处:http://blog.csdn.net/xiangpingli/article/details/47706707 使用socket.recv(pack_l ...

  5. 图片后门捆绑利用工具 – FakeImageExploiter

    在这里,要向大家推荐一款名为“Fake Image Exploiter”的安全工具,该工具可以在图片文件中捆绑隐藏的恶意.bat或.exe程序,方便钓鱼或社工攻击测试过程中的入侵控制.如果受害者点击该 ...

  6. 根据IP定位城市

    根据IP定位城市:http://www.sucaihuo.com/js/35.html 示例:http://www.sucaihuo.com/jquery/0/35/demo/

  7. linux命令详解之netstat

    今天在使用linux的时候,要查看端口号,但是不知道要使用哪一个命令所以就学习了一下,原来是使用netstat,接下来给大家一起来学习. 一.netstat介绍 1.1.简介 Netstat 命令用于 ...

  8. v$Session详解

    从Oracle10gR1开始,Oracle在V$SESSION中增加关于等待事件的字段,实际上也就是把原来V$SESSION_WAIT视图中的所有字段全部整合到了V$SESSION视图中,开始的时候我 ...

  9. mysql数据库使用mysqldump工具针对一个数据库备份,使用--databases选项与不使用该参数的区别

    需求描述: 今天在做mysqldump备份某个数据库的试验,在备份某个数据库的时候可以使用 --databases参数,也可以直接进行某个数据库的备份,那么这里记录下两者的区别 操作过程: 1.使用- ...

  10. Java精选笔记_集合概述(Collection接口、Collections工具类、Arrays工具类)

    集合概述 集合有时又称为容器,简单地说,它是一个对象,能将具有相同性质的多个元素汇聚成一个整体.集合被用于存储.获取.操纵和传输聚合的数据. 使用集合的技巧 看到Array就是数组结构,有角标,查询速 ...