【Codeforces Round #459 (Div. 2) C】The Monster

【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

左括号看成1 右括号看成-1 设置l,r表示前i个数的和的上下界
遇到 左括号 l和r同时加1
遇到右括号 同时减1
遇到问号 因为问号可以为1或-1所以l减1而r加1
如果在某个时刻r小于0了 就说明再也不能继续了 因为说明左括号和问号比右括号来得少了

如果l<0则把l置为0,因为不允许和出现<0的情况

否则如果l等于0就说明有一种方法能让前i个数的和为0
当然当前枚举的序列长度要为偶数

【代码】

#include <bits/stdc++.h>
using namespace std;

const int N = 5e3;

char s[N+10];
int n;
int main(){
    #ifdef LOCAL_DEFINE
        freopen("rush_in.txt", "r", stdin);
    #endif
    ios::sync_with_stdio(0),cin.tie(0);
    cin >>(s+1);
    n = strlen(s+1);
    int ans = 0;
    for (int i = 1;i <= n;i++){
        int l = 0,r = 0;
        for (int j = i;j <= n;j++){
            if (s[j]=='('){
                l++,r++;
            }else if (s[j]==')'){
                l--,r--;
            }else if (s[j]=='?') {
                l--,r++;
            }
            if (r<0) break;
            if (l<0) l = 0;
            if (l==0 && ((j-i+1)%2==0)) ans++;
        }
    }
    cout<<ans<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/8384019.html

时间: 2024-07-31 17:00:06

【Codeforces Round #459 (Div. 2) C】The Monster的相关文章

【Codeforces Round #459 (Div. 2) B】 Radio Station

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 用map模拟一下映射就好了. [代码] #include <bits/stdc++.h> using namespace std; int n,m; map<string,string> dic; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", stdin); #endif ios::sync_with_

【Codeforces Round #446 (Div. 2) A】Greed

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 贪心选容量大的瓶子就好 [代码] #include <bits/stdc++.h> #define int long long using namespace std; const int N = 1e5; int n; int a[N+10],b[N+10]; main(){ #ifdef LOCAL_DEFINE freopen("F:\\c++source\\rush_in.txt", "r

【Codeforces Round #446 (Div. 2) C】Pride

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 想一下,感觉最后的结果肯定是从某一段开始,这一段的gcd为1,然后向左和向右扩散的. 则枚举那一段在哪个地方. 我们设这一段中所有的数字都做了一次gcd. 假设在i..j这一段. 则求gcd的顺序是(i,i+1),(i+1,i+2)...(j-1,j) 这样a[j]=gcd(a[i],a[i+1]..a[j])了 即顺序求了一遍gcd. 这样,预处理一下i到j的gcd. 如果gcd[i][j]==1,则获取到一个可行方案. 求一

【Codeforces Round #447 (Div. 2) A】QAQ

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] C语言程序练习题 [代码] #include <bits/stdc++.h> using namespace std; string s; int main(){ #ifdef LOCAL_DEFINE freopen("F:\\c++source\\rush_in.txt", "r", stdin); #endif ios::sync_with_stdio(0),cin.tie(0);

【Codeforces Round #451 (Div. 2) D】Alarm Clock

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 尺取法+二分. 类似滑动窗口. 即左端点为l,右端点为r. 维护a[r]-a[l]+1总是小于等于m的就好. (大于m就右移左端点) 然后看看里面的数字个数是不是小于k; 不是的话让l..r中最右边那个数字删掉就好. ->链表优化一下即可. [代码] /* 1.Shoud it use long long ? 2.Have you ever test several sample(at least therr) yourself

【Codeforces Round #452 (Div. 2) A】 Splitting in Teams

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 贪心 1优先和2组队. 如果1没有了 就结束. 如果1还有多余的. 那么就自己3个3个组队 [代码] #include <bits/stdc++.h> using namespace std; const int N = 2e5; int n; int a[3]; int main(){ #ifdef LOCAL_DEFINE freopen("rush_in.txt", "r", st

【Codeforces Round #452 (Div. 2) B】Months and Years

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 闰,平,平 平,闰,平 平,平,闰 平,平,平 4种情况都考虑到就好. 可能有重复的情况. 但是没关系啦. [代码] #include <bits/stdc++.h> using namespace std; const int N = 24; int p[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int r[12] = {31,29,31,30,31,30,31,31,30,3

【Codeforces Round #452 (Div. 2) C】 Dividing the numbers

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] n为偶数. l = 1, r = n (l,r)放在一组 l++,r-- 新的l,r放在另外一组 直到l+1==r 这个时候,判断两组的和,如果一样的话,分散在两组 差为1否则差为0 n为奇数 l = 2,r = n (l,r)放在一组 l++,r-- 新的l,r放在另外一组 直到l+1==r 这个时候,判断两组的和,如果一样的话,分散在两组 差为0(把1放在那个较少的组) 否则,差为1 1随意放在哪一组都可以 [代码] #in

【Codeforces Round #456 (Div. 2) C】Perun, Ult!

[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] set1 < pair < int,int > > set1;记录关键点->某个人怪物永远打不死了,第一维是时间,第二维是下标 int dic[1e5+10] //记录对应下标的怪物它此时此刻在何时打不死了 set2 < pair< int,int > > set2;关键点2->有怪物要更新了的时间点,以及记录的信息下标idx2 之所以这样记录.是为了尽可能多地让怪物存活时间长一