Bracket Sequence
Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %lld & %llu

[Submit]   [Go Back]   [Status]

Description

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 opearations.

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.

Input

In the first line there is an integer T (T≤10), indicates the number of test cases. Each case begins with a line containing an integers N (N ≤ 100,000 and N is a even number), the size of the initial brackets sequence. The next line contains a string whose length is N consisting of '(' and ')'. In the third of each test case, there is an integer M(M ≤ 100,000) indicates the number of queries. Each of the following M lines contains one operation as mentioned below. The index of the bracket sequence is labeled from 0 to N - 1.

Three operation description:
set l r c: change all the elements range in [l,r] into '(' or ')'.(c is '(' or ')')
reverse l r: reverse the interval [l,r]
query l,r: you should answer that interval [l,r] is regular or not

Output

For each test case, print a line containing the test case number (beginning with 1) on its own line, then the answer for each "query" operation, if the interval is regular, print "YES", otherwise print "NO", one on each line.
Print a blank line after each test case.

Sample Input

1
6
((()))
8
query 0 5
set 0 5 (
query 0 5
reverse 3 5
query 0 5
query 1 4
query 2 3
query 0 4

Sample Output

Case 1:
YES
NO
YES
YES
YES
NO

Hint

Huge input, use "scanf" instead of "cin".

Source

Classic Problem
 
线段树,把左右括号标记成-1,1。。。合法的区间的总和为零,且从左向右的累加和 小于等于 0
维护每个结点的sum max,为方便reserv再多维护一个min reserv时交换max,min的绝对值再成-1
set与reserv并存时,要先reserv再set
 
 #include <iostream>
#include <cstring>
#include <cstdio> #define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 using namespace std; const int maxn=; int setv[maxn<<],rev[maxn<<],sum[maxn<<],mx[maxn<<],mi[maxn<<];
char str[maxn]; void reserve(int rt)
{
sum[rt]=-sum[rt];
swap(mx[rt],mi[rt]);
mx[rt]=-mx[rt];
mi[rt]=-mi[rt];
rev[rt]^=;
} void set(int op,int rt,int len)
{
sum[rt]=op*len;
mx[rt]=sum[rt]>?sum[rt]:;
mi[rt]=sum[rt]<?sum[rt]:;
setv[rt]=op;rev[rt]=;
} void push_down(int rt,int ll,int lr)
{
if(rev[rt])
{
if(setv[rt]) setv[rt]*=-;
else reserve(rt<<),reserve(rt<<|);
rev[rt]=;
}
if(setv[rt])
{
set(setv[rt],rt<<,ll),set(setv[rt],rt<<|,lr);
setv[rt]=;
}
} void push_up(int rt)
{
sum[rt]=sum[rt<<]+sum[rt<<|];
mx[rt]=max(mx[rt<<],sum[rt<<]+mx[rt<<|]);
mi[rt]=min(mi[rt<<],sum[rt<<]+mi[rt<<|]);
} void build(int l,int r,int rt)
{
setv[rt]=rev[rt]=;
if(l==r)
{
sum[rt]=(str[l]=='(')?-:;
mx[rt]=(sum[rt]<)?:;
mi[rt]=(sum[rt]<)?-:;
return;
}
int m=(l+r)>>;
build(lson),build(rson);
push_up(rt);
} void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
if(c) set(c,rt,r-l+);
else reserve(rt);
return ;
}
int m=(l+r)>>;
push_down(rt,m-l+,r-m);
if(L<=m) update(L,R,c,lson);
if(R>m) update(L,R,c,rson);
push_up(rt);
} int query_sum(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return sum[rt];
}
int m=(l+r)>>,ans=;
push_down(rt,m-l+,r-m);
if(L<=m) ans+=query_sum(L,R,lson);
if(R>m) ans+=query_sum(L,R,rson);
push_up(rt);
return ans;
} int query_max(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
return mx[rt];
}
int m=(l+r)>>,ret;
push_down(rt,m-l+,r-m);
if(R<=m) ret=query_max(L,R,lson);
else if(L>m) ret=query_max(L,R,rson);
else ret=max(query_max(L,R,lson),query_sum(L,R,lson)+query_max(L,R,rson));
push_up(rt);
return ret;
} int main()
{
int t,cas=;
char cmd[];
scanf("%d",&t);
while(t--)
{
int n,m;
printf("Case %d:\n",cas++);
scanf("%d",&n);
scanf("%s",str);
build(,n-,);
scanf("%d",&m);
while(m--)
{
scanf("%s",cmd);
if(cmd[]=='s')
{
int a,b; char c[];
scanf("%d%d%s",&a,&b,c);
if(c[]=='(')
update(a,b,-,,n-,);
else if(c[]==')')
update(a,b,,,n-,);
}
else if(cmd[]=='r')
{
int a,b;
scanf("%d%d",&a,&b);
update(a,b,,,n-,);
}
else if(cmd[]=='q')
{
int a,b;
scanf("%d%d",&a,&b);
if(!query_sum(a,b,,n-,)&&!query_max(a,b,,n-,)) puts("YES");
else puts("NO");
}
}
putchar();
}
return ;
}

UESTC 1546 Bracket Sequence的更多相关文章

  1. (中等) UESTC 94 Bracket Sequence,线段树+括号。

    There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...

  2. CF#138 div 1 A. Bracket Sequence

    [#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...

  3. CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)

    E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...

  4. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈

    C. Replace To Make Regular Bracket Sequence 题目连接: http://www.codeforces.com/contest/612/problem/C De ...

  5. Codeforces Beta Round #5 C. Longest Regular Bracket Sequence 栈/dp

    C. Longest Regular Bracket Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.c ...

  6. Replace To Make Regular Bracket Sequence

    Replace To Make Regular Bracket Sequence You are given string s consists of opening and closing brac ...

  7. CF1095E Almost Regular Bracket Sequence

    题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...

  8. D - Replace To Make Regular Bracket Sequence

    You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). ...

  9. CodeForces - 612C Replace To Make Regular Bracket Sequence 压栈

    C. Replace To Make Regular Bracket Sequence time limit per test 1 second memory limit per test 256 m ...

随机推荐

  1. 项目自动化建构工具gradle 入门3——生一个exe的helloWorld

    前两次呢,我们能够用一个外部的jar 来实现输出helloWorld.但问题是我每次都要用java -jar 来执行,这样我们自己玩还可以,让用户玩就不好了.所以我们生成一个exe给他们吧.这次我们仍 ...

  2. html小技巧

    占位符 插入一个非间断空格.一般来说,无论你按多少次空格键,HTML也只会在单词之间显示一个空白间隔.当你需要插入多个空格时,请输入 或 代码.它们名为"空格占位符",你输入几个, ...

  3. [No00009A]JsonToObject json与类互转

    using System.Web.Script.Serialization; /// <summary> /// 内部类,保存jsonData /// </summary> p ...

  4. [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)

    Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...

  5. 理解HTML语义化

    1.什么是HTML语义化? <基本上都是围绕着几个主要的标签,像标题(H1~H6).列表(li).强调(strong em)等等> 根据内容的结构化(内容语义化),选择合适的标签(代码语义 ...

  6. Spring.net 配置说明

    Spring.net使用说明   使用方法: 1.在配置文件设置Spring.net 节点  在配置节中,声明Spring.net,配置 context,objects 标签,来源(type) < ...

  7. firefox 使用svg的image标签无法显示图片

    在image标签上添加 height.width(不要用css属性) href属性前面加xlink: (Mozilla自己的MDN都说不加xlink了,搞鸡巴)

  8. [LeetCode] Trips and Users 旅行和用户

    The Trips table holds all taxi trips. Each trip has a unique Id, while Client_Id and Driver_Id are b ...

  9. [LeetCode] Missing Ranges 缺失区间

    Given a sorted integer array where the range of elements are [0, 99] inclusive, return its missing r ...

  10. Ubuntu下基于Saprk安装Zeppelin

    前言 Apache Zeppelin是一款基于web的notebook(类似于ipython的notebook),支持交互式地数据分析,即一个Web笔记形式的交互式数据查询分析工具,可以在线用scal ...