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 ...
随机推荐
- 禁用Windows重复数据删除
重复数据删除,可以减少磁盘占用,但使用不当也有可能增加IO,另外,也为此功能会将硬盘分块,所以当硬盘占用较高时,进行碎片整理也比较困难,所以有时需要禁用掉重复数据删除功能,并解除重复数据的优化,可以通 ...
- 实例:对2个Makefile的备注
实例1:Makefile编译链接简单.c函数 example.c Makefile exe: example.c gcc example.c -o exe clean: rm exe 执行效果: 实例 ...
- AC日记——滑动窗口 洛谷 P1886
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 00 Cadence学习总目录
这个系列是我学习于博士CADENCE视频教程60讲时,一边学一边记的笔记.使用的CADENCE16.6. 01-03课 了解软件 创建工程 创建元件库 分裂元件的制作方法 04课 正确使用hetero ...
- [No000095].Net入门级逆向工程-1.SpreadsheetGear汉化
一.SpreadsheetGear汉化 最近,我们的有个项目要用到表格功能,由于历(la)史(ji)遗(kuang)留(jia)的问题,我们不得不用第三方的一个插件SpreadsheetGear来实现 ...
- Python学习进程
1周第1天 主要是变量的学习(11月8日) 1.1 python安装(win和linux下)1.2 ipython安装及使用1.3 变量的定义1.4 变量赋值1.5 运算符(赋值.算术.关系.逻辑)1 ...
- xml解析
config.xml <?xml version="1.0" encoding="UTF-8"?> <prize> <gift&g ...
- iOS 解决LaunchScreen中图片加载黑屏问题
iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...
- [LeetCode] Add Two Numbers II 两个数字相加之二
You are given two linked lists representing two non-negative numbers. The most significant digit com ...
- [LeetCode] Search Insert Position 搜索插入位置
Given a sorted array and a target value, return the index if the target is found. If not, return the ...