Parenthesis

来源:互联网 发布:电脑文件数据恢复 编辑:程序博客网 时间:2024/05/17 08:22

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");}
原创粉丝点击