原题链接

http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809

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

Source

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

题意:给了一个平衡的括号序列s(平衡是指括号匹配正常) 现在q次询问,每次输入两个数a、b  问将s[a]  s[b]交换后是否任然平衡,平衡则输出“Yes”  否则输出“No”;

思路:定义数组num[] ,num[i]表示s[1]到s[i]中左括号数减去右括号数的差值,分析可知因为s是平衡括号序列,那么num[i]>=0   令a<b  ,那么交换s[a] s[b]后,只对num[a]~num[b-1]产生影响,并且交换后当num[k]<0(a<=k<b)时表示不平衡,而只有s[a]='('  s[b]=')' 交换后才可能使num[k]<0 。所以特判当s[a]='('  s[b]=')'时,用线段树求区间a~b-1的最小值,当最小值小于2时,即交换后不平衡,为什么呢?   s[a]='('  s[b]=')'交换后num[a]~num[b-1]都减2;

代码如下:

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
#define eps 1e-8
#define maxn 105
#define inf 0x3f3f3f3f3f3f3f3f
#define IN freopen("in.txt","r",stdin);
using namespace std;
char s[];
int num[];
int a,b; struct Node
{
//int l,r;
int v;
}node[*]; void build(int l,int r,int i)
{
if(l==r) {
node[i].v=num[l];
return;
}
int mid=(l+r)>>;
build(l,mid,i<<);
build(mid+,r,i<<|);
node[i].v=min(node[i<<].v,node[i<<|].v);
} void query(int l,int r,int &tmp,int i)
{
if(l>=a&&r<=b) { tmp=node[i].v; return; }
int mid=(l+r)>>;
if(mid>=b) query(l,mid,tmp,i<<);
else if(mid<a) query(mid+,r,tmp,i<<|);
else {
int tmp2;
query(l,mid,tmp,i<<);
query(mid+,r,tmp2,i<<|);
tmp=min(tmp,tmp2);
}
} int main()
{
int n,q;
while(scanf("%d%d",&n,&q)!=EOF)
{
scanf("%s",s+);
num[]=;
for(int i=;i<=n;i++)
{
num[i]=num[i-];
if(s[i]=='(') num[i]++;
else num[i]--;
}
build(,n,);
while(q--)
{
scanf("%d%d",&a,&b);
if(a>b) swap(a,b); if(s[a]==s[b]||s[a]==')'&&s[b]=='(') puts("Yes");
else
{
b--;
int tmp=;
query(,n,tmp,);
if(tmp<) puts("No");
else puts("Yes");
}
}
}
return ;
}
/**
8 8
(())(())
2 7
*/

2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)的更多相关文章

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

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

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

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

  3. 【模拟】【数学】CSU 1803 2016 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1803 题目大意: 给定n,m(n,m<=109)1<=i<=n,1& ...

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

    如果 a * b % 2016 == 0 如果a = 1 ,且 a * b % 2016 == 0 考虑一下a = 2017的时候 2017 * b = (2016 + 1) * b % 2016 = ...

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

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

  6. 【最短路】【数学】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), ...

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

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

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

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

  9. 【拓扑】【宽搜】CSU 1084 有向无环图 (2016湖南省第十二届大学生计算机程序设计竞赛)

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1804 题目大意: 一个有向无环图(DAG),有N个点M条有向边(N,M<=105 ...

随机推荐

  1. atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性

    atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性   1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...

  2. Java六大问题你都懂了吗?

    这些问题对于认真学习java的人都要必知的,当然如果你只是初学者就没必要那么严格了,那如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列. 一.到底要怎么样初始化! 本问题讨论 ...

  3. 使用JSExcelXML.js导出Excel模板

      github地址:https://github.com/464884492/JSExcelXml 业务系统显示效果图 导出模板图 功能描述    世间万物总是相生相克,既然我们的客户要求有导出Ex ...

  4. 查看 table,view,sp的定义

    1, 查看用户创建的Proc,View, UDF,trigger 的定义 sys.sql_modules Returns a row for each object that is an SQL la ...

  5. java简单词法分析器(源码下载)

    java简单词法分析器 : http://files.cnblogs.com/files/hujunzheng/%E7%AE%80%E5%8D%95%E8%AF%8D%E6%B3%95%E5%88%8 ...

  6. Windows常用技巧集锦

    1. Word中如何消除回车符 文件—选项—显示—勾掉段落标记 2. Windows不重启就使环境变量修改生效 以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH ...

  7. 有关PHP、HTML单引号、双引号转义以及转成HTML实体的那些事!

    一.单引号和双引号转义在PHP的数据存储过程中用得比较多,即往数据库里面存储数据时候需要注意转义单.双引号: 先说几个PHP函数: 1.addslashes — 使用反斜线引用(转义)字符串: 返回字 ...

  8. Java多线程系列--“JUC线程池”02之 线程池原理(一)

    概要 在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构.线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析Th ...

  9. MySQL的学习--触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  10. 蒙特·卡罗算法的Python实现

    一 背景 此算法诞生的背景是: 曼哈顿计划,有极大的计算需求. 计算机刚开始发展,最适合做计算. 蒙特卡洛算法理论基础是概率论,实际就是暴力计算逼近理想结果.正是在以上两个背景下,它刚好得到了极大的应 ...