(中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations.
- we can choose a interval [l,r], and set all the elements range in this interval to left bracket or right bracket.
- 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:
- Empty sequence is a regular sequence.
- If
S
is a regular sequence, then(S)
is also a regular sequences. - If
A
andB
are regular sequences, thenAB
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,线段树+括号。的更多相关文章
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
- UESTC 1546 Bracket Sequence
Bracket Sequence Time Limit: 3000MS Memory Limit: 65536KB 64 ...
- Wow! Such Sequence!(线段树4893)
Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 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 ...
- hdu4893Wow! Such Sequence! (线段树)
Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...
- HDU 6047 Maximum Sequence(线段树)
题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=6047 题目: Maximum Sequence Time Limit: 4000/2000 MS (J ...
- 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 ...
- hdu 5828 Rikka with Sequence 线段树
Rikka with Sequence 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5828 Description As we know, Rik ...
- [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
随机推荐
- 两个数组各个数相加或相乘变成一个矩阵求第K大
input 1<=T<=20 1<=n<=100000,1<=k<=n*n a1 a2 ... an 0<ai<=10000 b1 b2 ... bn ...
- php 版本比较
判断当前运行的 PHP 版本是否高于或等于你提供的版本号. function is_php($version) { static $_is_php; $version = (string) $vers ...
- Mac系统Git生成ssh公钥
Mac系统Git生成ssh公钥 在使用Git仓库进行代码管理时,新的电脑上往往需要生成ssh公钥进行匹配,Mac系统生成Git公钥过程如下: 1.检查本机是否已有公钥 在终端中输入如下命令: ? 1 ...
- OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)
OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰) 前文曾详细探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反 ...
- android Actionmode 样式自定义
<style name="Base.Theme.DesignDemo" parent="Theme.AppCompat.Light.NoActionBar" ...
- HTML一些小细节
这里主要是记录一些看起来不重要,但是其实作用不小或者使用起来某种情况下好用的东西,又或者是重要的但容易忽略的基础知识 1. HTML5之后的第一个标签是<!DOCTYPE html> 这个 ...
- Django - 用户注册
使用Django工程自动创建的auth_user表来存储用户信息 在app目录下创建forms.py mysite/music/forms.py from django.contrib.auth.mo ...
- PAT (Advanced Level) 1101. Quick Sort (25)
树状数组+离散化 #include<cstdio> #include<cstring> #include<cmath> #include<map> #i ...
- 支付宝集成+网站支付+APP支付+手机网站支付
网站支付宝 1.申请签约后获得相应的pid:208***开头和key 这里说明下pc网站支付采用md5加密所以这里只需要提供pid和key不需要上传公钥. 2.下载即时到账demo http://do ...
- discuz 添加板块失败解决办法
最近把服务器环境升了下级,发现discuz后台添加栏目添加不了了,数据库没变,源代码没变,就突然添加不了了.刚开始添加1个板块成功了,再添加就怎么也添不进去了.只是页面刷新了一下,啥提示没有. 经过一 ...