Submission #255239

#TimeUsernameProblemLanguageResultExecution timeMemory
255239Kastandaparentrises (BOI18_parentrises)C++11
100 / 100
85 ms55736 KiB
// M
#include<bits/stdc++.h>
using namespace std;
const int MXN = 1000006, N = 303, Mod = 1e9 + 7;
int Sub;
void SolveSub1()
{
        int q;
        char S[MXN];
        fill(S, S + MXN, 0);
        scanf("%d", &q);
        for (; q; q --)
        {
                scanf("%s", S);
                int n = strlen(S);
                vector < int > C(n, 0), Stk, OP;
                for (int i = 0; i < n; i ++)
                {
                        if (S[i] == '(')
                                Stk.push_back(i);
                        else if (Stk.size())
                                C[Stk.back()] = C[i] = 1, Stk.pop_back();
                        else
                                OP.push_back(i);
                }
                bool Fail = 0;
                vector < int > Kts, PO;
                for (int i = n - 1; ~ i; i --)
                {
                        if (Stk.size())
                        {
                                if (Stk.back() == i)
                                {
                                        if (!Kts.size())
                                                {Fail = 1; break;}
                                        C[Kts.back()] += 2;
                                        Kts.pop_back();
                                        C[Stk.back()] += 2;
                                        Stk.pop_back();
                                        continue;
                                }
                                if (S[i] == '(')
                                        continue;
                                Kts.push_back(i);
                        }
                        else
                        {
                                if (OP.size() && OP.back() == i)
                                {
                                        PO.push_back(OP.back());
                                        OP.pop_back();
                                        continue;
                                }
                                if (S[i] == ')')
                                        continue;
                                if (PO.size())
                                {
                                        C[PO.back()] += 2;
                                        PO.pop_back();
                                        C[i] += 2;
                                }
                        }
                }
                if (PO.size() || OP.size() || Stk.size())
                        Fail = 1;
                fill(S, S + n, 0);
                if (Fail)
                        printf("impossible\n");
                else
                {
                        for (int i = 0; i < n; i ++)
                                printf("%c", "RBG"[C[i] - 1]);
                        printf("\n");
                }
        }
        exit(0);
}
int dp[N][N][N], dp2[N][N], R[N], F[N];
inline void Add(int &a, int b)
{
        a += b;
        if (a >= Mod)
                a -= Mod;
}
inline void SolveSub2()
{
        int n = 300;
        F[0] = 1;
        dp2[0][0] = 1;
        dp[0][0][0] = 1;
        for (int i = 0; i < n; i ++)
        {
                for (int j = 0; j <= i; j ++)
                {
                        // '('
                        Add(dp2[i + 1][j + 1], dp2[i][j]);
                        // ')'
                        if (j) Add(dp2[i + 1][j - 1], dp2[i][j]);
                        for (int h = 0; h <= i; h ++)
                        {
                                // '('
                                Add(dp[i + 1][j + 1][h + 1], dp[i][j][h]);
                                // ')'
                                if (j)
                                        Add(dp[i + 1][j - 1][h], dp[i][j][h]);
                                else if (h)
                                {
                                        Add(dp[i + 1][j][h - 1], dp[i][j][h]);
                                        if (j == 0)
                                                Add(F[i + 1], dp[i][j][h]);
                                }
                        }
                }
        }
        for (int i = 1; i <= n; i ++)
                for (int j = 0; j <= i; j ++)
                        for (int h = 0; j + h <= i; h ++)
                                R[i] = (R[i] + 1LL * F[j] * F[h] % Mod * dp2[i - j - h][0]) % Mod;

        int q;
        scanf("%d", &q);
        for (; q; q --)
        {
                scanf("%d", &n);
                printf("%d\n", R[n]);
        }
        return ;
}
int main()
{
        scanf("%d", &Sub);
        if (Sub == 1)
                SolveSub1();
        else
                SolveSub2();
        return 0;
}

Compilation message (stderr)

parentrises.cpp: In function 'void SolveSub1()':
parentrises.cpp:11:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &q);
         ~~~~~^~~~~~~~~~
parentrises.cpp:14:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
                 scanf("%s", S);
                 ~~~~~^~~~~~~~~
parentrises.cpp: In function 'int main()':
parentrises.cpp:131:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &Sub);
         ~~~~~^~~~~~~~~~~~
parentrises.cpp: In function 'void SolveSub2()':
parentrises.cpp:121:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d", &q);
         ~~~~~^~~~~~~~~~
parentrises.cpp:124:22: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
                 scanf("%d", &n);
                 ~~~~~^~~~~~~~~~
#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...