1809: Parenthesis

Description

Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions.
The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions are individual so that they have no affect on others.
Parenthesis sequence S is balanced if and only if:
1. S is empty;
2. or there exists balanced parenthesis sequence A,B such that S=AB;
3. or there exists balanced parenthesis sequence S' such that S=(S').

Input

The input contains at most 30 sets. For each set:
The first line contains two integers n,q (2≤n≤105,1≤q≤105).
The second line contains n characters p1 p2…pn.
The i-th of the last q lines contains 2 integers ai,bi (1≤ai,bi≤n,ai≠bi).

Output

For each question, output "Yes" if P remains balanced, or "No" otherwise.

Sample Input

4 2
(())
1 3
2 3
2 1
()
1 2

Sample Output

No
Yes
No

HINT

题意:

  给你长度n的合法括号匹配和q个询问

  每次询问你 交换ai,bi两个位置的符号,交换后是否还是合法的

题解:

  分块

  (转化为1,)转化为-1

  合法括号序列满足前缀和永远大于等于0

  利用这个每次修改两个位置

  维护这个关系就好了

  分块可过的

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std; #pragma comment(linker, "/STACK:102400000,102400000")
#define ls i<<1
#define rs ls | 1
#define mid ((ll+rr)>>1)
#define pii pair<int,int>
#define MP make_pair typedef long long LL;
const long long INF = 1e18;
const double Pi = acos(-1.0);
const int N = 2e5+, M = 1e6+, mod = 1e6+, inf = ; int block,n,q,m;
int sum[N],pos[N],mi[N],a[N],b[N],add[N],f[N];
char ch[N];
void init() {
int s = ;
pos[] = ;
memset(b,,sizeof(b));
memset(sum,,sizeof(sum));
memset(add,,sizeof(add));
for(int i = ; i <= n; ++i) b[i] = a[i];
for(int i = ; i <= n; ++i) sum[i] = sum[i-] + b[i];
for(int i = ; i < N; ++i) mi[i] = inf;
for(int i = ; i <= n; ++i) {
if(pos[i] != pos[i-]) s = ;
s += b[i];
mi[pos[i]] = min(mi[pos[i]],s);
}
for(int i = ; i <= n; ++i) add[pos[i]] += b[i];
f[] = ;
s = ;
for(int i = ; i <= n; ++i) {
s+=b[i];
if(s < ) f[i] = ;
else f[i] = f[i-];
}
}
int solve(int l,int r) {
int OK = ;
swap(b[l],b[r]);
if(pos[l] == pos[r]) {
int s = sum[block * (pos[l]-)];
for(int i = block * (pos[l]-) + ; i <= min(pos[l] * block,n); ++i) {
s += b[i];
if(s < ) OK = ;
}
for(int i = pos[l]+; i <= m; ++i) {
if(s + mi[i] < ) OK = ;
s += (add[i]);
}if(s < ) OK = ;
} else {
int s = sum[block * (pos[l]-)];
for(int i = block*(pos[l]-) + ; i <= min(pos[l] * block,n); ++i) {
s += b[i];
if(s < ) OK = ;
}
for(int i = pos[l]+; i <= pos[r]-; ++i) {
if(s + mi[i] < ) OK = ;
s += (add[i]);
}
for(int i = block * (pos[r]-) + ; i <= min(pos[r]*block,n); ++i) {
s += b[i];
if(s < ) OK = ;
}
for(int i = pos[r]+; i <= m; ++i) {
if(s + mi[i] < ) OK = ;
s += (add[i]);
}
}
swap(b[l],b[r]);
if(OK == ) return ;
else return ;
}
int main() {
while(scanf("%d%d",&n,&q)!=EOF) {
scanf("%s",ch);
block = int(sqrt(n));
memset(a,,sizeof(a));
memset(pos,,sizeof(pos));
for(int i = ; i <= n; i++) {if(ch[i-] == '(') a[i] = ; else a[i] = -; pos[i]=(i-)/block+;}
if(n%block) m = n/block + ; else m = n/block;
init();
for(int i = ; i <= q; ++i) {
int l,r;
scanf("%d%d",&l,&r);
if(l > r) swap(l,r);
if(solve(l,r) == ) printf("Yes\n");
else printf("No\n");
}
}
return ;
}

湖南省第十二届大学生计算机程序设计竞赛 G Parenthesis的更多相关文章

  1. 2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

    原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthes ...

  2. 2016年湖南省第十二届大学生计算机程序设计竞赛Problem A 2016 找规律归类

    Problem A: 2016 Time Limit: 5 Sec  Memory Limit: 128 MB Description  给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) ...

  3. 湖南省第十二届大学生计算机程序设计竞赛 F 地铁 多源多汇最短路

    1808: 地铁 Description Bobo 居住在大城市 ICPCCamp. ICPCCamp 有 n 个地铁站,用 1,2,…,n 编号. m 段双向的地铁线路连接 n 个地铁站,其中第 i ...

  4. 湖南省第十二届大学生计算机程序设计竞赛 B 有向无环图 拓扑DP

    1804: 有向无环图 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 187  Solved: 80[Submit][Status][Web Board ...

  5. 湖南省第十二届大学生计算机程序设计竞赛 A 2016

    1803: 2016 Description  给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量:   1. 1≤a≤n,1≤b≤m; 2. a×b 是 2016 的倍数. In ...

  6. 【模拟】CSU 1807 最长上升子序列~ (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1807 题目大意: 给你一个长度为N(N<=105)的数列,数列中的0可以被其他数 ...

  7. 【最短路】【数学】CSU 1806 Toll (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1806 题目大意: N个点M条有向边,给一个时间T(2≤n≤10,1≤m≤n(n-1), ...

  8. 【树状数组】CSU 1811 Tree Intersection (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1811 题目大意: 一棵树,N(2<=N<=105)个节点,每个节点有一种颜 ...

  9. 【数学】CSU 1810 Reverse (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1810 题目大意: 一个长度为N的十进制数,R(i,j)表示将第i位到第j位翻转过来后的 ...

随机推荐

  1. 如何恢复低版本的FlashPlayer

    本人做页游开发时,游戏用户那边经常会遇到一些很奇怪的问题.比如: 1.用户进入游戏,只显示游戏部分界面,chrome浏览器是正常的,就IE死活不行. 2.进入游戏时白屏或者一直加载不上. 3.玩游戏时 ...

  2. ACM/ICPC 之 "嵌套"队列 -插队(POJ2259)

    这里插队的意思就是排队时遇到熟人则插到其后,否则排到队尾.(这个习惯不太好)(题意) 题目要求我们模拟“插队模型”和队列的入队和出队完成此算法. 由于题目的输入输出很多,此题的查找操作(找到熟人)需要 ...

  3. [转] 理解 Thread.Sleep 函数

    原文链接:http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时 ...

  4. ubuntu mysql 安装和外网访问配置

    1.输入 sudo apt-get install mysql-server 安装过程中会让你输入密码,这个密码是root的密码. 安装完毕后,就可以正常使用了,如果你需要外网用户能够连接继续下面的步 ...

  5. Effective C++ -----条款32:确定你的public继承塑模出is-a关系

    “public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...

  6. 关于C语言中的转义字符

    1.转义字符的分类 1. 1一般转义字符 这种转义字符,虽然在形式上由两个字符组成,但只代表一个字符.常用的一般转义字符为: \a     \n     \t     \v     \b     \r ...

  7. 【python】dict4ini和xmltodict模块用途

    dict4ini模块:可以读写配置文件 xmltodict模块:将xml和json互相转换  https://pypi.python.org/pypi/xmltodict

  8. POJ 3185 The Water Bowls (高斯消元)

    题目链接 题意:翻译过来就是20个0或1的开关,每次可以改变相邻三个的状态,问最小改变多少次使得所有开关都置为0,题目保证此题有解. 题解:因为一定有解,所以我们可以正序逆序遍历两次求出较小值即可.当 ...

  9. LightOJ1336 Sigma Function(约数和为偶数的个数)

    Sigma Function Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit ...

  10. xmpp的bug

    [微分享]:事前必三思,事中要坚韧,事后莫悔恨,只有眼光看远些,脚步坚实些,人生方多些圆满,少些遗憾. xmpp的bug