There is a sequence of brackets, which supports two kinds of operations.

  1. we can choose a interval [l,r], and set all the elements range in this interval to left bracket or right bracket.
  2. we can reverse a interval, which means that for all the elements range in [l,r], if it's left bracket at that time, we change it into right bracket, vice versa.

  Fish is fond of Regular Bracket Sequence, so he want to know whether a interval [l,r] of the sequence is regular or not after doing some operations.

  Let us define a regular brackets sequence in the following way:

  1. Empty sequence is a regular sequence.
  2. If S is a regular sequence, then (S) is also a regular sequences.
  3. If A and B are regular sequences, then AB is a regular sequence.

  

  题目大意就是说给你一个括号序列,对他进行操作和询问,包括反转和覆盖两个操作。

  维护一个总和,还有一个最小前缀和(还要维护最大前缀和,在反转的时候计算最小的。)。当总和和最小前缀和都为0,则成立。

  这个题又被坑了好久,没办法,水平太差了,错了十几次,电子科大的提交记录都被我刷屏了。。。错误百出。。。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring> #define lson L,M,po*2
#define rson M+1,R,po*2+1
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b) using namespace std; int BIT[*];
int QS[*];
int MS[*];
int XOR[*];
int COL[*];
char ss[]; void pushUP(int po)
{
BIT[po]=BIT[po*]+BIT[po*+];
QS[po]=max(QS[po*],BIT[po*]+QS[po*+]); //这里要注意。
MS[po]=min(MS[po*],BIT[po*]+MS[po*+]);
} void pushDown(int po,int len)
{
if(COL[po])
{
COL[po*]=COL[po];
COL[po*+]=COL[po];
XOR[po*]=XOR[po*+]=; //这里不能忘记。
BIT[po*]=(len-(len/))*COL[po];
BIT[po*+]=(len/)*COL[po]; QS[po*]=max(-,BIT[po*]);
QS[po*+]=max(-,BIT[po*+]);
MS[po*]=min(,BIT[po*]);
MS[po*+]=min(,BIT[po*+]); COL[po]=;
} if(XOR[po])
{
int temp; XOR[po*]=!XOR[po*];
XOR[po*+]=!XOR[po*+]; BIT[po*]=-BIT[po*];
BIT[po*+]=-BIT[po*+]; temp=QS[po*];
QS[po*]=-MS[po*];
MS[po*]=-temp; temp=QS[po*+];
QS[po*+]=-MS[po*+];
MS[po*+]=-temp; XOR[po]=;
}
} void build_tree(int L,int R,int po)
{
XOR[po]=;
COL[po]=; if(L==R)
{
if(ss[L]=='(')
{
BIT[po]=;
QS[po]=;
MS[po]=;
}
else
{
BIT[po]=-;
QS[po]=-;
MS[po]=-;
} return;
} int M=(L+R)/; build_tree(lson);
build_tree(rson); pushUP(po);
} void update_col(int ul,int ur,int ut,int L,int R,int po)
{
if(ul<=L&&ur>=R)
{
XOR[po]=;
COL[po]=ut;
BIT[po]=ut*(R-L+); QS[po]=max(-,BIT[po]);
MS[po]=min(,BIT[po]); return;
} pushDown(po,R-L+); int M=(L+R)/; if(ul<=M)
update_col(ul,ur,ut,lson);
if(ur>M)
update_col(ul,ur,ut,rson); pushUP(po);
} void update_xor(int ul,int ur,int L,int R,int po)
{
if(ul<=L&&ur>=R)
{
XOR[po]=!XOR[po];
BIT[po]=-BIT[po]; int temp=QS[po];
QS[po]=-MS[po];
MS[po]=-temp; return;
} pushDown(po,R-L+); int M=(L+R)/; if(ul<=M)
update_xor(ul,ur,lson);
if(ur>M)
update_xor(ul,ur,rson); pushUP(po);
} int query(int &qs,int ql,int qr,int L,int R,int po) //不能忘记写 & !!!
{
if(ql<=L&&qr>=R)
{
qs=MS[po];
return BIT[po];
} pushDown(po,R-L+); int M=(L+R)/;
int ans=; if(qr<=M)
return query(qs,ql,qr,lson);
if(ql>M)
return query(qs,ql,qr,rson); int temp1,temp2,a1; a1=query(temp1,ql,qr,lson);
ans=a1+query(temp2,ql,qr,rson); qs=min(temp1,temp2+a1); return ans;
} bool getans(int ql,int qr,int N)
{
int t1;
int ans; if((qr-ql)%==)
return ; ans=query(t1,ql,qr,,N,); if(ans==&&t1==)
return ;
else
return ;
} int main()
{
int T;
int N,Q;
char t1[],t2[];
int a,b;
cin>>T; for(int cas=;cas<=T;++cas)
{
printf("Case %d:\n",cas); scanf("%d",&N);
scanf("%s",ss); build_tree(,N-,); //这里应该是N-1。 scanf("%d",&Q); for(int i=;i<Q;++i)
{
scanf("%s %d %d",t1,&a,&b); if(t1[]=='s')
{
scanf("%s",t2);
update_col(a,b,t2[]=='('?:-,,N-,);
}
else if(t1[]=='r')
update_xor(a,b,,N-,);
else
if(getans(a,b,N-))
printf("YES\n");
else
printf("NO\n");
} printf("\n");
} return ;
}

(中等) UESTC 94 Bracket Sequence,线段树+括号。的更多相关文章

  1. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  2. UESTC 1546 Bracket Sequence

                                        Bracket Sequence Time Limit: 3000MS   Memory Limit: 65536KB   64 ...

  3. Wow! Such Sequence!(线段树4893)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...

  4. Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸

    D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...

  5. hdu4893Wow! Such Sequence! (线段树)

    Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...

  6. HDU 6047 Maximum Sequence(线段树)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...

  7. Codeforces 438D The Child and Sequence - 线段树

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...

  8. hdu 5828 Rikka with Sequence 线段树

    Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...

  9. [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列

    题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...

随机推荐

  1. 444A/CF

    题目链接[http://codeforces.com/problemset/problem/444/A] 题意:给出一个无向图,找出一个联通子图,定义密度#=v(顶点值的和)/e(边值的和). 条件: ...

  2. android图片加水印,文字

    两种方法: 1.直接在图片上写文字 String str = "PICC要写的文字"; ImageView image = (ImageView) this.findViewByI ...

  3. Java中的值栈

    OGNL表示式使用 和 值栈 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts2框架使用OGNL作为默认的表达式 ...

  4. [转]于Fragment和Activity之间onCreateOptionsMenu的问题

    Fragment和Activity一样,可以重写onCreateOptionsMenu方法来设定自己的菜单,其实这两个地方使用onCreateOptionsMenu的目的和效果都是完全一样的,但是由于 ...

  5. Oracle新建用户赋只读某几张表的权限

    create user JSETI_WZQ identified by abcdef; -- 假设abcdef是密码 grant connect,resource to JSETI_WZQ; gran ...

  6. Git 使用初体验

    http://my.oschina.net/moooofly/blog/228608 很久之前在 http://git.oschina.net/ 上创建了一个私有项目 modb ,目的主要是用来学习如 ...

  7. kick_ball

    package com.hereyouare.KickBall; import android.app.Activity; import android.app.AlertDialog; import ...

  8. 为什么我的Android SDK Manager中只显示已安装的package?

    如图.在菜单packages中,前两项我都是选了的 . 两种可能: 1. 明显是楼主连不上谷歌的更新服务器了,换成国内的吧,左上Tools-->Options弹出的界面有两个可以填写的 ,下面一 ...

  9. hibernate事务并发问题(脏读,不可重复读,幻读)

    脏读  dirty read:  读了别的事务没有提交的事务, 可能回滚, 数据可能不对. 不可重复读 non repeatable read: 同一个事务里前后读出来的数据不一样, 被另一个事务影响 ...

  10. Mac linux 安装memcached服务 用法

    今天在Mac上安装memcached服务的时候 由于安装memcached之前需要安装libevent依赖包 所以使用brew install libevent 安装过程中报错 Warning: Yo ...