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. android执行外部命令、检测文件是否存在、自动检测U盘路径

    private final String UDiskFileName = "/2969_logo/bootfile.image"; private final String Loc ...

  2. 河南多校大一训练赛 G 硬币

    题目链接:http://acm.hust.edu.cn/vjudge/contest/125004#problem/G 密码:acm Description 宇航员Bob有一天来到火星上,他有收集硬币 ...

  3. 关于MyEclipse不停报错multiple problems have occurred 或者是内存不足 的解决办法

    这是因为 worksapace与svn代码不一样,要更新! 一更新就好了,困扰死我了,卧槽,搞了2个小时,难怪svn一提交就卡死人,原来还就是svn的问题,更新一下就行.

  4. 看unix高级编程时遇到apue.h找不到的问题

    最近学习 Unix 环境高级编程这本书,第一个例子就碰到了问题,下面是解决办法. 一开始看到这本书,刚翻了几页,就觉得对味.按照书中的代码做练习时,编译代码文件提示fatal error: apue. ...

  5. 设置span 宽度的完美解决方案

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. push控制器 卡顿

    代码: RecommendController *rec = [[RecommendController alloc]init]; [self.navigationController pushVie ...

  7. hadoop Yarn运行机制

  8. WebDriver(Selenium2) 根据新窗口title切换窗口

    http://uniquepig.iteye.com/blog/1559321 在webdriver官方的api中,切换窗口的方法提供的参数是nameOrHandle. 引用 http://uniqu ...

  9. C语言写的俄罗斯方块

    源:C语言写的俄罗斯方块 2014年最后一天, 任天堂将风靡全球30年的经典游戏<<俄罗斯方块>>下架. 作为全球最畅销的游戏, 其移植版本遍布各个平台. 下面这个是我去年在5 ...

  10. PAT (Advanced Level) 1002. A+B for Polynomials (25)

    为0的不要输出. #include<iostream> #include<cstring> #include<cmath> #include<algorith ...