UESTC 1546 Bracket Sequence
| Time Limit: 3000MS | Memory Limit: 65536KB | 64bit IO Format: %lld & %llu |
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
维护每个结点的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的更多相关文章
- (中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...
- CF#138 div 1 A. Bracket Sequence
[#138 div 1 A. Bracket Sequence] [原题] A. Bracket Sequence time limit per test 2 seconds memory limit ...
- CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)
E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...
- 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 ...
- 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 ...
- Replace To Make Regular Bracket Sequence
Replace To Make Regular Bracket Sequence You are given string s consists of opening and closing brac ...
- CF1095E Almost Regular Bracket Sequence
题目地址:CF1095E Almost Regular Bracket Sequence 真的是尬,Div.3都没AK,难受QWQ 就死在这道水题上(水题都切不了,我太菜了) 看了题解,发现题解有错, ...
- D - Replace To Make Regular Bracket Sequence
You are given string s consists of opening and closing brackets of four kinds <>, {}, [], (). ...
- 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 ...
随机推荐
- 三维网格精简算法(Quadric Error Metrics)附源码
在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如 ...
- 轻量级C#编辑器RoslynPad
简介 RoslynPad是一个Apache 2.0协议开源的轻量级C#编辑器.支持自动完成,语法提示,修改建议等功能.很适合平时随手写个C#程序看看运行结果. 目前版本:0.10.1,无需保存也可以运 ...
- 内网劫持渗透新姿势:MITMf简要指南
声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...
- canvas arcTo()用法详解
CanvasRenderingContext2D对象的方法arcTo()的用法. arcTo(x1, y1, x2, y2, radius) arcTo()方法将利用当前端点.端点1(x1,y1)和端 ...
- [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, ...
- C#文件目录操作完全手册
需要 using System.IO; 1) 相对路径转绝对路径string fullfolder = HttpContext.Current.Server.MapPath(folder); 2) 文 ...
- 【WPF】新复制wpf项目报错
错误提示:Program does not contain a static 'Main' method suitable for an entry point 1.App.xaml 文件属性:生成操 ...
- python网络编程-socket编程
一.服务端和客户端 BS架构 (腾讯通软件:server+client) CS架构 (web网站) C/S架构与socket的关系: 我们学习socket就是为了完成C/S架构的开发 二.OSI七层 ...
- Git 耍不起来啊
1. $ git clone https://******.git Cloning into 'dt-engine-server'...fatal: unable to access 'https: ...
- Block 代码快
1.原理 1.1block类型 a.全局bock块 贯彻整个程序 b.栈块 存在于栈内存中,作用域中使用 c.堆块 自行管理其内存 注*:http://blog.parse.com/learn ...