2016湖南省第G题 题目链接
在知乎上看了叉姐的题解后还是没懂说是贪心法 后来明白只有交换前者‘(’和后者‘)’ 因为这样的交换会导致前面的左括号‘(’减少 而要使得交换后括号匹配就必须使得交换区间[a,b)内的左括号数量减去右括号数量大于2 (l[i] - r[i] <= 1 小于等于1交换后就不匹配)
//在中南大学评测机上用cin cout会超时 菜鸡再也不用了
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
const int INF = 1e5 + 5;
int n, q, be, en;
int l[INF], r[INF]; //[1~n]每个前缀的左右括号的数量
char ch[INF];
bool solve(int a, int b)
{
bool judge = true;
if (ch[a] == ch[b])
return true;
else if (ch[a] == ')')
return true;
for (int i = a; i < b; i++)
{
if (l[i] - r[i] <= 1)
judge = false;
}
return judge;
}
int main()
{
while (~scanf("%d%d", &n, &q))
{
scanf("%s", ch + 1);
l[0] = r[0] = 0;
for (int i = 1; i <= n; i++){
l[i] = l[i - 1]; r[i] = r[i - 1];
if (ch[i] == '(') l[i]++;
else r[i]++;
}
int a, b;
while (q--)
{
scanf("%d%d", &a, &b);
if (a> b)swap(a, b);
if (solve(a, b))
puts("Yes");
else
puts("No");
}
}
return 0;
//system("pause");
}