2209: [Jsoi2011]括号序列

Time Limit: 20 Sec  Memory Limit: 259 MB
Submit: 1111  Solved: 541
[Submit][Status][Discuss]

Description

Input

输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数。 第二行包含一个长度为N的括号序列。 接下来Q行,每行三个整数t、x和y,分别表示操作的类型、操作的开始位置和操作的结 束位置,输入数据保证x不小于y。其中t=0表示询问操作、t=1表示反转操作、t=2表示翻转操 作。

Output

对于每一个询问操作,输出一行,表示将括号序列的该子序列修改为配对,所需的最少改动 个数。

Sample Input

6 3
)(())(
0 1 6
0 1 4
0 3 4

Sample Output

2
2
0

HINT

100%的数据满足N,Q不超过10^5

Source

第一轮


背景:把钥匙锁机房里了只能来电子阅览室,在寒冷潮湿的空气中竟然1A了太感动了(虽然不完全是自己想出来的)

括号问题一个常用手法是 ( -1  ) +1

最后要修改的一定是)))((((这个样子,而)))的个数就是这个序列的最小前缀和,(((同理

那么修改次数就是(lmn+1)/2+(rmx+1)/2

信息合并和动态最大子序列问题很像啦

翻转和反转之后信息如何维护?

翻转:只要交换l..和r..就好了

反转:所有.mx .mn都要取负,然后swap(lmx,lmn) swap(rmx,rmn)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
#define lc t[x].ch[0]
#define rc t[x].ch[1]
#define pa t[x].fa
const int N=1e5+,INF=1e9;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
int n,Q,l,r,a[N];
char s[N],op[];
struct node{
int ch[],fa,size,v,sum,lmx,lmn,rmx,rmn,rev,flp;
node():fa(){ch[]=ch[]=;}
}t[N];
int root;
inline int wh(int x){return t[pa].ch[]==x;}
inline void update(int x){
if(!x) return;
t[x].size=t[lc].size+t[rc].size+;
t[x].sum=t[lc].sum+t[rc].sum+t[x].v;
t[x].lmx=max(t[lc].lmx,max(t[lc].sum+t[x].v,t[lc].sum+t[x].v+t[rc].lmx));
t[x].lmn=min(t[lc].lmn,min(t[lc].sum+t[x].v,t[lc].sum+t[x].v+t[rc].lmn));
t[x].rmx=max(t[rc].rmx,max(t[rc].sum+t[x].v,t[rc].sum+t[x].v+t[lc].rmx));
t[x].rmn=min(t[rc].rmn,min(t[rc].sum+t[x].v,t[rc].sum+t[x].v+t[lc].rmn)); }
inline void rever(int x){
t[x].rev^=;
swap(lc,rc);
swap(t[x].lmx,t[x].rmx);
swap(t[x].lmn,t[x].rmn);
}
inline void flip(int x){
t[x].flp^=;
t[x].sum=-t[x].sum;t[x].v=-t[x].v;
t[x].lmx=-t[x].lmx;t[x].lmn=-t[x].lmn;
swap(t[x].lmx,t[x].lmn);
t[x].rmx=-t[x].rmx;t[x].rmn=-t[x].rmn;
swap(t[x].rmx,t[x].rmn);
}
inline void pushDown(int x){
if(t[x].rev){
if(lc) rever(lc);
if(rc) rever(rc);
t[x].rev=;
}
if(t[x].flp){
if(lc) flip(lc);
if(rc) flip(rc);
t[x].flp=;
}
} inline void rotate(int x){
int f=t[x].fa,g=t[f].fa,c=wh(x);
if(g) t[g].ch[wh(f)]=x;t[x].fa=g;
t[f].ch[c]=t[x].ch[c^];t[t[f].ch[c]].fa=f;
t[x].ch[c^]=f;t[f].fa=x;
update(f);update(x);
}
inline void splay(int x,int tar){
for(;pa!=tar;rotate(x))
if(t[pa].fa!=tar) rotate(wh(x)==wh(pa)?pa:x);
if(tar==) root=x;
} int build(int l,int r,int f){//printf("build %d %d %d\n",l,r,f);
if(l>r) return ;
int x=(l+r)>>;
lc=build(l,x-,x);rc=build(x+,r,x);
t[x].fa=f;
t[x].rev=t[x].flp=;//printf("al %d\n",a[l]);
t[x].v=a[x];//not need
update(x);//printf("get %d %d %d %d %d %d %d %d %d\n",x,l,r,t[x].v,t[x].sum,t[x].lmx,t[x].lmn,t[x].rmx,t[x].rmn);
return x;
}
inline int kth(int k){//printf("kth %d\n",k);
int x=root,ls=;
while(x){
pushDown(x);
int _=ls+t[lc].size;//printf("size %d %d\n",x,_);
if(_<k&&k<=_+) return x;
else if(k<=_) x=lc;
else ls=_+,x=rc;
}
return ;
}
void Query(int l,int r){//printf("query %d %d\n",l,r);
int f=kth(l);splay(f,);
int x=kth(r+);splay(x,f);
int a=t[lc].lmx,b=t[lc].rmn;//printf("hi %d %d %d %d %d\n",f,x,lc,a,b);
printf("%d\n",(a+)/+(-b+)/);
}
void Flip(int l,int r){
int f=kth(l);splay(f,);
int x=kth(r+);splay(x,f);
flip(lc);update(x);update(f);
}
void Rever(int l,int r){
int f=kth(l);splay(f,);
int x=kth(r+);splay(x,f);
rever(lc);update(x);update(f);
}
int main(){
//freopen("in.txt","r",stdin);
n=read();Q=read();
scanf("%s",s+);
for(int i=;i<=n;i++) a[i+]=s[i]=='('?-:;
//for(int i=1;i<=n+2;i++) printf("%d ",a[i]);puts("");
t[].lmn=t[].rmn=INF;
t[].lmx=t[].rmx=-INF;
root=build(,n+,root);
while(Q--){
scanf("%s",op);l=read();r=read();
if(op==) Query(l,r);
if(op==) Flip(l,r);
if(op==) Rever(l,r);
}
}

BZOJ 2209: [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]括号序列 平衡树

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

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

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

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

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

  5. BZOJ 2329: [HNOI2011]括号修复 [splay 括号]

    题目描述 一个合法的括号序列是这样定义的: 空串是合法的. 如果字符串 S 是合法的,则(S)也是合法的. 如果字符串 A 和 B 是合法的,则 AB 也是合法的. 现在给你一个长度为 N 的由‘(' ...

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

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

  7. ●BZOJ 2209 [Jsoi2011]括号序列

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2209 题解: Splay 很好的题,但是把智障的我给恶心到了...   首先不难发现,最后没 ...

  8. BZOJ2209 [Jsoi2011]括号序列 splay

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

  9. [HNOI2011][bzoj 2329] 括号修复 [splay+前缀和]

    题面: http://www.lydsy.com/JudgeOnline/problem.php?id=2329 思路: 显然,操作4中输出补全的最小费用是关键 这决定了我们不可能在splay上只维护 ...

随机推荐

  1. 最短路<dijk>

    题意: 有n个城市,有m条路,给出每条路的出发和结束的城市及长度,求从第一个城市到最后一个城市的最短路.按格式输出. power oj 2443 题解: 标准dijk算法. #include<c ...

  2. [转]程序开发基础学习二(C++ Google Style 命名规则)

    无规矩不成方圆,新的岗位就需要服从团队的编码规则.很开心团队用的是Google的C++编码规则,大概看了下Google 的编码规则,正如九天翔雁说的:“Google的 C++ Style Guide远 ...

  3. c语言scanf详解

    函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]);scanf()函数是通用终端格式化输入函数,它从标准输入设备(键 ...

  4. m,mm,mmm的用法

    通过查看android源码目录下的build/envsetup.sh文件,可知: - m:       Makes from the top of the tree. - mm:      Build ...

  5. elasticsearch的5种分片查询优先级

    elasticsearch可以使用preference参数来指定分片查询的优先级,使用时就是在请求url上加上preference参数,如:http://ip:host/index/_search?p ...

  6. Django: 配置和静态文件

    运行django-admin.py startproject [project-name] 命令会生成一系列文件,在django 1.6版本以后的settings.py文件中有以下语句: # Buil ...

  7. Servlet程序开发-- 取得其他内置对象

    servlet本身提供的只有request和response对象,如果要取得session对象,只能依靠request对象,因为session属于HTTP协议范畴,而且在每次发送请求的时候,服务器都会 ...

  8. android4.0蓝牙使能的详细解析(转)

    源:http://www.cnblogs.com/xiaochao1234/p/3818193.html 本文详细分析了android4.0 中蓝牙使能的过程,相比较android2.3,4.0中的蓝 ...

  9. 微信公众号系列 --- ionic在IOS的键盘弹出问题

    在使用ionic开发IOS系统微信的时候会有一个苦恼的问题,填写表单的时候键盘会挡住输入框,其实并不算什么大问题,只要用户输入一个字就可以立刻看见输入框了. 可惜的是,有些客户是不讲理的,他才不管这个 ...

  10. BroadcastReceiver的两种注册方式之------静态注册

    activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&qu ...