UESTC 1546 Bracket Sequence
这题掉了一句话,调了N久~~~
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 100010;
int setv[MAXN<<2], XOR[MAXN<<2], sum[MAXN<<2], maxv[MAXN<<2], minv[MAXN<<2];
int val[MAXN];
char str[MAXN];void PushUp(int rt)
{sum[rt] = sum[rt<<1] + sum[rt<<1|1];maxv[rt] = max(maxv[rt<<1], sum[rt<<1] + maxv[rt<<1|1]);minv[rt] = min(minv[rt<<1], sum[rt<<1] + minv[rt<<1|1]);
}void PushDown(int rt, int l, int r)
{int m = (l + r)>>1;if(setv[rt] != 0){setv[rt<<1] = setv[rt<<1|1] = setv[rt];XOR[rt<<1] = XOR[rt<<1|1] = 0;sum[rt<<1] = (m - l + 1) * setv[rt];sum[rt<<1|1] = (r - m) * setv[rt];maxv[rt<<1] = max(-1, setv[rt]*(m-l+1));minv[rt<<1] = min(1, setv[rt]*(m-l+1));maxv[rt<<1|1] = max(-1, setv[rt]*(r-m));minv[rt<<1|1] = min(1, (r-m)*setv[rt]);setv[rt] = 0; ///}if(XOR[rt]){if(setv[rt<<1] != 0)setv[rt<<1] = -setv[rt<<1];elseXOR[rt<<1] ^= 1;if(setv[rt<<1|1] != 0)setv[rt<<1|1] = -setv[rt<<1|1];elseXOR[rt<<1|1] ^= 1;sum[rt<<1] = -sum[rt<<1];sum[rt<<1|1] = -sum[rt<<1|1];int temp;temp = minv[rt<<1];minv[rt<<1] = -maxv[rt<<1];maxv[rt<<1] = -temp;temp = minv[rt<<1|1];minv[rt<<1|1] = -maxv[rt<<1|1];maxv[rt<<1|1] = -temp;XOR[rt] = 0; }return ;
}void Bulid(int l, int r, int rt)
{setv[rt] = 0;XOR[rt] = 0;if(l == r){sum[rt] = val[l];maxv[rt] = val[l];minv[rt] = val[l];return ;}int m = (l + r)>>1;Bulid(l, m, rt<<1);Bulid(m + 1, r, rt<<1|1);PushUp(rt);return ;
}void Update(int L, int R, int op, int l, int r, int rt)
{if(L == l && R == r){if(op == 1){setv[rt] = -1;XOR[rt] = 0;sum[rt] = -(r - l + 1);maxv[rt] = -1;minv[rt] = -(r - l + 1);}else if(op == 2){setv[rt] = 1;XOR[rt] = 0;sum[rt] = (r - l + 1);maxv[rt] = (r - l + 1);minv[rt] = 1;}else if(op == 3){if(setv[rt] != 0)setv[rt] = -setv[rt];elseXOR[rt] ^= 1;sum[rt] = -sum[rt];int temp = minv[rt];minv[rt] = -maxv[rt];maxv[rt] = -temp;}return ;}PushDown(rt, l, r);int m = (l + r)>>1;if(R <= m)Update(L, R, op, l, m, rt<<1);else if(L > m)Update(L, R, op, m + 1, r, rt<<1|1);else{Update(L, m, op, l, m, rt<<1);Update(m + 1, R, op, m + 1, r, rt<<1|1);}PushUp(rt);return ;
}void Query(int L, int R, int l, int r, int rt, int &s, int &maxval)
{if(L == l && R == r){s = sum[rt]; maxval = maxv[rt];return ;}PushDown(rt, l, r);int m = (l + r)>>1;if(R <= m)Query(L, R, l, m, rt<<1, s, maxval);else if(L > m)Query(L, R, m + 1, r, rt<<1|1, s, maxval);else{int ts1, tmaxval1, ts2, tmaxval2;Query(L, m, l, m, rt<<1, ts1, tmaxval1);Query(m + 1, R, m + 1, r, rt<<1|1, ts2, tmaxval2);s = ts1 + ts2;maxval = max(tmaxval1, ts1 + tmaxval2);return ;}
}int main()
{//freopen("aa.in", "r", stdin);int T, n, m; int s, maxval, kcase = 0;char op[10]; int a, b; char ch;scanf("%d", &T);while(T--){kcase++;scanf("%d", &n);scanf("%s", str + 1);for(int i = 1; i <= n; ++i){if(str[i] == '(') val[i] = -1;if(str[i] == ')') val[i] = 1;}printf("Case %d:\n", kcase);Bulid(1, n, 1);scanf("%d", &m);while(m--){scanf("%s", op);if(op[0] == 's'){scanf("%d %d %c", &a, &b, &ch);Update(a + 1, b + 1, (ch == '(' ? 1 : 2), 1, n, 1);}if(op[0] == 'r'){scanf("%d %d", &a, &b);Update(a + 1, b + 1, 3, 1, n, 1);}if(op[0] == 'q'){scanf("%d %d", &a, &b);Query(a + 1, b + 1, 1, n, 1, s, maxval);if(s == 0 && maxval <= 0)printf("YES\n");elseprintf("NO\n");}}printf("\n");}return 0;
}
UESTC 1546 Bracket Sequence相关推荐
- UESTC 1546 Bracket Sequence
UESTC_1546 这个题目可以借用判断合法括号序列的办法,将'('看作1,将')'看作-1,之后从左向右扫描一个序列并将扫描到的值累加起来,在这个过程中如果任意时刻这些值的和都不小于0,并且最后的 ...
- uestc 1546 Bracket Sequence (成段更新)
题意:有T(T<10)组测试数据,然后有一个数字N(N<100000),接下来的一行里有N个字符,每个字符是'('或')',有三种操作(1)"set l r c",表示 ...
- 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 ...
- Codeforces 524F And Yet Another Bracket Sequence 哈希
And Yet Another Bracket Sequence 枚举起点, 增加的(肯定在最前面, 增加的)肯定在最后面, 比字典序用hash, 卡了自然溢出.. #include<bits/ ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表
E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...
- CF思维联系–CodeForces -224C - Bracket Sequence
ACM思维题训练集合 A bracket sequence is a string, containing only characters "(", ")", ...
- CodeForces - 224C. Bracket Sequence (栈模拟)简单做法
A bracket sequence is a string, containing only characters "(", ")", "[&quo ...
- cf1556Compressed Bracket Sequence
cf1556Compressed Bracket Sequencex 题意: 给你n个数,奇数位置上的数表示左括号的数量,偶数位置上的数表示右括号的数量.问有多少个[l,r]是满足括号匹配的 题解: ...
最新文章
- phone clone android,Phone Clone
- 虚拟化基础架构Windows 2008篇之12-WSUS工作站端配置
- 腾讯云安全专家 Killer 告诉你,企业上云怎么做更安全
- php中的echo单引号_PHP的数据类型
- centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间
- Java—正则表达式(Pattern类和Matcher类)
- PAT乙级(1005 继续(3n+1)猜想)
- jemeter python接口自动化测试平台_python接口自动化测试之request
- 【clickhouse】clickhouse配置多块磁盘
- java BIO/NIO/AIO 学习
- java关于排版的说法正确是_Java代码规范--排版,命名---以及一个例子
- Silverlight下载-Silverlight 1.1 Tools下载
- linux安装mysql菜鸟教程_[新手教程]Linux环境部署MYSQL过程
- 新站快速排名的seo优化流程
- 一直都以为阿里的程序员待遇是最好的,结果真正的土豪竟然是……
- Python自动化测试详解
- 杠杆炒股的两种操作方法
- 谷歌大数据的三驾马车
- Openjudge:正常血压
- 基于jsp+servlet的银行管理系统(eclipse控制台和mysql数据库交互)。