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相关推荐

  1. UESTC 1546 Bracket Sequence

    这题掉了一句话,调了N久~~~ #include <cmath> #include <cstdio> #include <cstdlib> #include < ...

  2. uestc 1546 Bracket Sequence (成段更新)

    题意:有T(T<10)组测试数据,然后有一个数字N(N<100000),接下来的一行里有N个字符,每个字符是'('或')',有三种操作(1)"set l r c",表示 ...

  3. 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 ...

  4. 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 ...

  5. Codeforces 524F And Yet Another Bracket Sequence 哈希

    And Yet Another Bracket Sequence 枚举起点, 增加的(肯定在最前面, 增加的)肯定在最后面, 比字典序用hash, 卡了自然溢出.. #include<bits/ ...

  6. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表

    E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...

  7. CF思维联系–CodeForces -224C - Bracket Sequence

    ACM思维题训练集合 A bracket sequence is a string, containing only characters "(", ")", ...

  8. CodeForces - 224C. Bracket Sequence (栈模拟)简单做法

    A bracket sequence is a string, containing only characters "(", ")", "[&quo ...

  9. cf1556Compressed Bracket Sequence

    cf1556Compressed Bracket Sequencex 题意: 给你n个数,奇数位置上的数表示左括号的数量,偶数位置上的数表示右括号的数量.问有多少个[l,r]是满足括号匹配的 题解: ...

最新文章

  1. css 层叠式样式表(2)
  2. 人工智能要多久才能理解动物?
  3. 深度学习笔记4:Self-Taught Learning and Unsupervised Feature Learning
  4. 6年,终拿腾讯 offer!
  5. 区块链、比特币的学习
  6. 【模拟】表达式求值(jzoj 1768)
  7. python ftp下载文件_文件上传下载Python
  8. python/c++计算psnr
  9. 我的Markdown的利器——Markdown Here、有道云笔记、iPic
  10. 详解linux运维工程师入门级必备技能
  11. java同步调用rabbitmq,使用RabbitMQ可以放慢同步发布/消耗速度
  12. cmd - 批量重命名文件
  13. 同步练习(Java SE(九))补充
  14. 认识web,web的标准构成和基本元素
  15. 机器学习-凸优化理论-课堂笔记
  16. java中的坦克大战游戏设计报告论文_毕业论文基于Java语言的坦克大战游戏设计...
  17. 论文阅读:Tackling the Challenges in Scene Graph Generation with Local-to-Glocal Interaction
  18. 告别人工叫号!门诊排队叫号系统,这样配置,性价比高
  19. Flutter实战-请求封装(五)之Isolate线程改造
  20. 认识区块链,认知区块链——NFT

热门文章

  1. might和could的区别用法_综合能力_谁知道Can、Could、May和Might的区别__沪江网
  2. 【zz】P2P技术简介—by红瞳
  3. 工业机器人-基于伺服电机的PMSM控制系统硬件电路设计
  4. 如何给Vue v-for循环渲染出的元素(导航栏) 批量添加点击事件 及 点击后添加css类样式 及 点击后路由跳转切换
  5. 用python的tkinter和爬虫制作一个天气查询窗口
  6. 二三四五4位高管 陈于冰董事长 代小虎财务总监 罗绘副总对外对公 邱俊祺董秘 实控人韩猛
  7. VB6播放MP3小程序
  8. torch.multinomial使用
  9. sketch android 切图,Sketch如何快速切图?三分钟教你掌握切图方案
  10. 科创板规则压实责任 券商投行业务重塑