Submission #69997

#TimeUsernameProblemLanguageResultExecution timeMemory
699973zpparentrises (BOI18_parentrises)C++14
100 / 100
225 ms13332 KiB
#include<bits/stdc++.h>
using namespace std;
int f[2000009];
int dp[2][609][609];
int ans[309];
int mod = 1e9+7;
main(){
    int P;
    cin >> P;
    if(P == 1){
        int t;
        cin >> t;

        while(t--){
            string s, ans = "";
            cin >> s;
            int a = 0, b = 0, fl = 0;
            for(int i = 0; i < s.size(); i++){
                if(s[i] == '(') a++;
                else b++;
            }
            if(a > 2 * b || b > 2 * a){
                cout << "impossible"<<endl;
                continue;
            }
            if(a > b){
                fl = 1;
                swap(a, b);
                reverse(s.begin(), s.end());
                for(int i = 0; i < s.size(); i++)
                    if(s[i] == '(') s[i] = ')';
                else s[i] = '(';
            }
            int k =  b - a;
            vector<int> X, Y;
            for(int i = 0; i < s.size(); i++){
                f[i] = 0;
                if(s[i] == '(') X.push_back(i);

            else Y.push_back(i);
            }
            for(int i = 0; i < k; i++)
                f[X[i]] = 1;
            int x = k, y = Y.size()-1;
            int A = 0, B = 0;
            while(x < X.size() && y >= 0 && X[x] < Y[y])
                f[X[x]] = 1, f[Y[y]] = 1, x++, y--;
            for(int i = 0; i < s.size(); i++){
                if(s[i] == '('){

                    if(f[i]) A++,B++,ans+='G';
                    else if(A < B) A++,ans+='R';
                    else B++, ans += 'B';
                }
                else{
                    if(f[i]) A--,B--, ans+='G';
                    else {if(A > B) A--, ans+='R';
                    else B--,ans+='B';
                    }
                }
                if(A < 0 ||  B < 0) fl = 2;
            }
            if(fl == 2) cout <<"impossible"<<endl;
            else {if (fl) reverse(ans.begin(), ans.end());
            cout<<ans<<endl;}
        }
    }
    else{

        dp[0][0][0] = 1;
        for(int i = 0; i <= 300; i++){
            int d = i % 2;
            int d1 = (i + 1) %2;
            for(int l = 0; l <= 600; l++)
                for(int r = l; r <= 600; r++)
                    dp[d1][l][r] = 0;
            for(int l = 0; l <= 600; l++)
                for(int r = l; r <= 600; r++){
                    dp[d1][max(0, l-2)][r - 1] += dp[d][l][r];
                    dp[d1][l + 1][r + 2] += dp[d][l][r];
                    if(dp[d1][max(0, l - 2)][r - 1] >= mod)
                        dp[d1][max(0, l - 2)][r - 1] -= mod;
                    if(dp[d1][l + 1][r + 2] >= mod)
                        dp[d1][l + 1][r + 2] -= mod;
                }
            for(int j = 0;  j <= 600; j++)
                ans[i] = (ans[i] + dp[d][0][j])% mod;
        }
        int t;
        cin >> t;
        while(t--){
            int N;
            cin >> N;
            cout << ans[N]<<endl;
        }
    }
}

Compilation message (stderr)

parentrises.cpp:7:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main(){
      ^
parentrises.cpp: In function 'int main()':
parentrises.cpp:18:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i = 0; i < s.size(); i++){
                            ~~^~~~~~~~~~
parentrises.cpp:30:34: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for(int i = 0; i < s.size(); i++)
                                ~~^~~~~~~~~~
parentrises.cpp:36:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i = 0; i < s.size(); i++){
                            ~~^~~~~~~~~~
parentrises.cpp:46:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             while(x < X.size() && y >= 0 && X[x] < Y[y])
                   ~~^~~~~~~~~~
parentrises.cpp:48:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int i = 0; i < s.size(); i++){
                            ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...