UESTC 1546 Bracket Sequence
UESTC_1546
这个题目可以借用判断合法括号序列的办法,将’(’看作1,将’)’看作-1,之后从左向右扫描一个序列并将扫描到的值累加起来,在这个过程中如果任意时刻这些值的和都不小于0,并且最后的时候这些值的和为0,那么就说明这个括号序列是合法的。
于是我们只要再用线段树实现修改及查询的操作,这个题目就算是解决了。为了便于修改和查询,我们可以用两个标记to、rev,to表示这个区间是否被set,rev表示这个区间是否被翻转。同时我们可以维护3个值lmin、lmax、sum,lmin表示从当前区间左端点开始最小的前缀和,lmax表示从当前区间开始最大的前缀和,sum表示当前区间的和。
#include<stdio.h> #include<string.h> #define MAXD 100010 int N, M, to[4 * MAXD], rev[4 * MAXD], lmin[4 * MAXD], lmax[4 * MAXD], sum[4 * MAXD]; char b[MAXD]; void Swap(int &x, int &y) {int t;t = x, x = -y, y = -t; } void pushdown(int cur, int x, int y) {int mid = (x + y) >> 1, ls = cur << 1, rs = cur << 1 | 1;if(to[cur] != -1){to[ls] = to[rs] = to[cur];rev[ls] = rev[rs] = 0;if(to[cur]){sum[ls] = mid - x + 1, sum[rs] = y - mid;lmin[ls] = lmin[rs] = 0;lmax[ls] = mid - x + 1, lmax[rs] = y - mid;}else{sum[ls] = -(mid - x + 1), sum[rs] = -(y - mid);lmin[ls] = -(mid - x + 1), lmin[rs] = -(y - mid);lmax[ls] = lmax[rs] = 0;}to[cur] = -1;}if(rev[cur]){rev[ls] ^= 1, rev[rs] ^= 1;sum[ls] = -sum[ls], sum[rs] = -sum[rs];Swap(lmin[ls], lmax[ls]), Swap(lmin[rs], lmax[rs]);rev[cur] = 0;} } void update(int cur) {int ls = cur << 1, rs = cur << 1 | 1;sum[cur] = sum[ls] + sum[rs];lmin[cur] = lmin[ls];if(sum[ls] + lmin[rs] < lmin[cur])lmin[cur] = sum[ls] + lmin[rs];lmax[cur] = lmax[ls];if(sum[ls] + lmax[rs] > lmax[cur])lmax[cur] = sum[ls] + lmax[rs]; } void build(int cur, int x, int y) {int mid = (x + y) >> 1, ls = cur << 1, rs = cur << 1 | 1;to[cur] = -1, rev[cur] = 0;if(x == y){if(b[x] == '(')sum[cur] = lmax[cur] = 1, lmin[cur] = 0;elsesum[cur] = lmin[cur] = -1, lmax[cur] = 0;return ;}build(ls, x, mid);build(rs, mid + 1, y);update(cur); } void query(int cur, int x, int y, int s, int t, int &min, int &ss) {int mid = (x + y) >> 1, ls = cur << 1, rs = cur << 1 | 1;if(x >= s && y <= t){if(ss + lmin[cur] < min)min = ss + lmin[cur];ss += sum[cur];return ;}pushdown(cur, x, y);if(mid >= s)query(ls, x, mid, s, t, min, ss);if(mid + 1 <= t)query(rs, mid + 1, y, s, t, min, ss); } void refresh(int cur, int x, int y, int s, int t, int c) {int mid = (x + y) >> 1, ls = cur << 1, rs = cur << 1 | 1;if(x >= s && y <= t){to[cur] = c, rev[cur] = 0;if(c)sum[cur] = lmax[cur] = y - x + 1, lmin[cur] = 0;elsesum[cur] = lmin[cur] = -(y - x + 1), lmax[cur] = 0;return ;}pushdown(cur, x, y);if(mid >= s)refresh(ls, x, mid, s, t, c);if(mid + 1 <= t)refresh(rs, mid + 1, y, s, t, c);update(cur); } void Reverse(int cur, int x, int y, int s, int t) {int mid = (x + y) >> 1, ls = cur << 1, rs = cur << 1 | 1;if(x >= s && y <= t){rev[cur] ^= 1;sum[cur] = -sum[cur], Swap(lmin[cur], lmax[cur]);return ;}pushdown(cur, x, y);if(mid >= s)Reverse(ls, x, mid, s, t);if(mid + 1 <= t)Reverse(rs, mid + 1, y, s, t);update(cur); } void solve() {int i, q, x, y, min, ss;char ch[10];scanf("%d", &q);for(i = 0; i < q; i ++){scanf("%s%d%d", ch, &x, &y);if(ch[0] == 's'){scanf("%s", ch);refresh(1, 0, N - 1, x, y, ch[0] == '(' ? 1 : 0);}else if(ch[0] == 'r')Reverse(1, 0, N - 1, x, y);else{min = ss = 0;query(1, 0, N - 1, x, y, min, ss);if(ss == 0 && min == 0)printf("YES\n");elseprintf("NO\n");}} } void init() {scanf("%d", &N);scanf("%s", b);build(1, 0, N - 1); } int main() {int t, tt;scanf("%d", &t);for(tt = 0; tt < t; tt ++){init();printf("Case %d:\n", tt + 1);solve();printf("\n");}return 0; }
UESTC 1546 Bracket Sequence相关推荐
- UESTC 1546 Bracket Sequence
这题掉了一句话,调了N久~~~ #include <cmath> #include <cstdio> #include <cstdlib> #include < ...
- 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]是满足括号匹配的 题解: ...
最新文章
- css 层叠式样式表(2)
- 人工智能要多久才能理解动物?
- 深度学习笔记4:Self-Taught Learning and Unsupervised Feature Learning
- 6年,终拿腾讯 offer!
- 区块链、比特币的学习
- 【模拟】表达式求值(jzoj 1768)
- python ftp下载文件_文件上传下载Python
- python/c++计算psnr
- 我的Markdown的利器——Markdown Here、有道云笔记、iPic
- 详解linux运维工程师入门级必备技能
- java同步调用rabbitmq,使用RabbitMQ可以放慢同步发布/消耗速度
- cmd - 批量重命名文件
- 同步练习(Java SE(九))补充
- 认识web,web的标准构成和基本元素
- 机器学习-凸优化理论-课堂笔记
- java中的坦克大战游戏设计报告论文_毕业论文基于Java语言的坦克大战游戏设计...
- 论文阅读:Tackling the Challenges in Scene Graph Generation with Local-to-Glocal Interaction
- 告别人工叫号!门诊排队叫号系统,这样配置,性价比高
- Flutter实战-请求封装(五)之Isolate线程改造
- 认识区块链,认知区块链——NFT
热门文章
- might和could的区别用法_综合能力_谁知道Can、Could、May和Might的区别__沪江网
- 【zz】P2P技术简介—by红瞳
- 工业机器人-基于伺服电机的PMSM控制系统硬件电路设计
- 如何给Vue v-for循环渲染出的元素(导航栏) 批量添加点击事件 及 点击后添加css类样式 及 点击后路由跳转切换
- 用python的tkinter和爬虫制作一个天气查询窗口
- 二三四五4位高管 陈于冰董事长 代小虎财务总监 罗绘副总对外对公 邱俊祺董秘 实控人韩猛
- VB6播放MP3小程序
- torch.multinomial使用
- sketch android 切图,Sketch如何快速切图?三分钟教你掌握切图方案
- 科创板规则压实责任 券商投行业务重塑