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...