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. 三维网格精简算法(Quadric Error Metrics)附源码

    在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如 ...

  2. 轻量级C#编辑器RoslynPad

    简介 RoslynPad是一个Apache 2.0协议开源的轻量级C#编辑器.支持自动完成,语法提示,修改建议等功能.很适合平时随手写个C#程序看看运行结果. 目前版本:0.10.1,无需保存也可以运 ...

  3. 内网劫持渗透新姿势:MITMf简要指南

    声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...

  4. canvas arcTo()用法详解

    CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...

  5. [LeetCode] Verify Preorder Serialization of a Binary Tree 验证二叉树的先序序列化

    One way to serialize a binary tree is to use pre-oder traversal. When we encounter a non-null node, ...

  6. C#文件目录操作完全手册

    需要 using System.IO; 1) 相对路径转绝对路径string fullfolder = HttpContext.Current.Server.MapPath(folder); 2) 文 ...

  7. 【WPF】新复制wpf项目报错

    错误提示:Program does not contain a static 'Main' method suitable for an entry point 1.App.xaml 文件属性:生成操 ...

  8. python网络编程-socket编程

     一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...

  9. Git 耍不起来啊

    1.  $ git clone https://******.git Cloning into 'dt-engine-server'...fatal: unable to access 'https: ...

  10. Block 代码快

    1.原理 1.1block类型 a.全局bock块   贯彻整个程序 b.栈块  存在于栈内存中,作用域中使用 c.堆块  自行管理其内存 注*:http://blog.parse.com/learn ...