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. UITabBarItem's appearance

    1.我们知道,用tabBarController创建出来默认的tabBar似这个样子滴... -----------------我是图片分割线----------------------------- ...

  2. phpmyadmin导出数据中文乱码问题

    phpMyAdmin版本是2.9.1.1 用phpMyAdmin备份数据库,导出来后,在本地用sqlyog还原的时候,出现如下错误:Error occured at:2009-03-03 10:09: ...

  3. CI 路由设置

    $route['news/show/(:num)']='news/show/$1';   前边是匹配 网址   后边是  指定控制器 在application/config/文件夹下有routes.p ...

  4. 后台如何解析json

    1.以前倒是没有怎没遇到过需要后台解析的,由于json传到后台实际上是传的一个字符串通常用到批量删除时 var rows = $('#tt').datagrid('getSelections'); v ...

  5. [转]Java初始化顺序总结 - 静态变量、静态代码块、成员变量、构造函数

    Java初始化顺序1在new B一个实例时首先要进行类的装载.(类只有在使用New调用创建的时候才会被java类装载器装入)2,在装载类时,先装载父类A,再装载子类B3,装载父类A后,完成静态动作(包 ...

  6. UVA - 1347 Tour(DP + 双调旅行商问题)

    题意:给出按照x坐标排序的n个点,让我们求出从最左端点到最右短点然后再回来,并且经过所有点且只经过一次的最短路径. 分析:这个题目刘汝佳的算法书上也有详解(就在基础dp那一段),具体思路如下:按照题目 ...

  7. HDU 1681 Frobenius(完全背包+标记装满)

    一个完全背包,数组两百万,暴力可过 #include<iostream> #include<cstdio> #include<cstring> using name ...

  8. as3 组件定义

    package kingBook{ import flash.display.MovieClip; import flash.events.Event; import flash.utils.setT ...

  9. POJ - 3666 Making the Grade(dp+离散化)

    Description A straight dirt road connects two fields on FJ's farm, but it changes elevation more tha ...

  10. Windows API 之 OpenProcessToken、GetTokenInformation

    The following example uses the OpenProcessToken and GetTokenInformation functions to get the group m ...