(中等) 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
Sis a regular sequence, then(S)is also a regular sequences. - If
AandBare regular sequences, thenABis 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 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
随机推荐
- cfdiv2/c/找规律
题目连接 £:若n<4,NO: £:若n==4,特判,n==5,特判. £:若n>=6,用2-4组成24,1和5和6组成零,即可. #include <set> #includ ...
- 事务(JDBC、Hibernate、Spring)
如果不用spring管理事务,我们自己写代码来操作事务.那么这个代码怎么写要看底层怎么访问数据库了. 当采用原生JDBC访问数据库时,操作事务需要使用java.sql.Connection的API.开 ...
- 使用libvirt做适配的kvm虚拟机window server 2008 磁盘性能的提升
实验室自己做了一个iaas的项目,当时是为了更方面的在kvm和xen下进行迁移,所以选择了libvirt作为适配层. 昨天简单的测试一了一下我们跟qingcloud的性能对比.我们的linux主机性能 ...
- 笔记整理--Linux平台MYSQL的C语言
Linux平台MYSQL的C语言API全列表 - 第三只眼的专栏 - 博客频道 - CSDN.NET - Google Chrome (2013/8/18 22:28:58) Linux平台MYS ...
- linux 用户管理维护 清缓存
#echo 1 > /proc/sys/ vm/drop_caches 2013.10.10 其实一直user group一直都没去弄清楚 只是没去归类,@@一种是对用户/组直接修改(同时也更改 ...
- java导出和读取excel数据
使用的是poi的jar包 下载地址http://poi.apache.org/download.html 主要是把jar包导入,直接新建一个列子测试一下就明白了.使用起来还是比较方便的,代码里面的原理 ...
- git rebase 使用
git rebase 不会取回代码 要用git fetch先取回, git rebase 是合并代码. (1)首先用git fetch返回服务器上的代码 (2)首先用git rebase origin ...
- IE7&IE8不支持rgba的方法
使用滤镜功能 filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#BF000000,endColorstr=#BF0000 ...
- 为什么MVC不是一种设计模式? ---比较Backbone和Ext4.x在MVC实现上的差异
为什么MVC不是一种设计模式? ---比较Backbone和Ext4.x在MVC实现上的差异 大漠穷秋 前言 圣人云:不想做妈咪的小姐不是好码农. 每一个码农的心中都有一个终极理想,那就是有一天不用再 ...
- C#入门经典(3-窗体应用程序-第二章要点)
新建一个窗体用用程序,拖一个按钮,加事件和Text属性.打开Form1Designer.cs.