Submission #61213

#TimeUsernameProblemLanguageResultExecution timeMemory
61213SpaimaCarpatilorparentrises (BOI18_parentrises)C++17
0 / 100
3 ms496 KiB
#include<bits/stdc++.h> using namespace std; int N; char sir[1000009], ans[1000009]; const int mod = 1e9 + 7; void adto (int &x, int y) {x += y; if (x >= mod) x -= mod;} void addGreens (int l, int r) { while (1) { while (sir[l] == ')' && l <= N) l ++; while (sir[r] == '(' && r >= 1) r --; if (l == N + 1 || r == 0) break; if (l < r) ans[l] = ans[r] = 'G', l ++, r --; else break; } } int main () { //freopen ("input", "r", stdin); //freopen ("output", "w", stdout); int type; scanf ("%d", &type); if (type == 1) { int tests; scanf ("%d\n", &tests); while (tests --) { scanf ("%s\n", sir + 1), N = strlen (sir + 1); int balance = 0; for (int i=1; i<=N; i++) if (sir[i] == '(') balance ++; else balance --; for (int i=1; i<=N + 1; i++) ans[i] = 0; bool ok = 1; if (balance > 0) { ///I'll use first X + balance open brackets and last X closed ones where X is maximal so that all the closed brackets come after the open ones int l = 1, r = N; while (balance > 0) { while (sir[r] == '(' && r >= 1) r --; if (r == 0) { ok = 0; break; } ans[r] = 'G', r --; balance --; } if (ok) { addGreens (l, r); int j = 0, k = 0; for (int i=1; i<=N; i++) { if (ans[i] == 'G') { if (sir[i] == '(') j ++, k ++; else j --, k --; continue; } if (sir[i] == '(') { if (j > k) k ++, ans[i] = 'B'; else j ++, ans[i] = 'R'; continue; } if (j < k) k --, ans[i] = 'B'; else j --, ans[i] = 'R'; if (j < 0) ok = 0; } if (!ok) assert (j + k == 0); } } else { balance = -balance; ///same as above int l = 1, r = N; while (balance > 0) { while (sir[l] == ')' && l <= N) l ++; if (l == N + 1) { ok = 0; break; } ans[l] = 'G', l ++; balance --; } if (ok) { addGreens (l, r); int j = 0, k = 0; for (int i=N; i>=1; i--) { if (ans[i] == 'G') { if (sir[i] == ')') j ++, k ++; else j --, k --; continue; } if (sir[i] == ')') { if (j > k) k ++, ans[i] = 'B'; else j ++, ans[i] = 'R'; continue; } if (j < k) k --, ans[i] = 'B'; else j --, ans[i] = 'R'; if (j < 0) ok = 0; } if (!ok) assert (j + k == 0); } } if (!ok) printf ("impossible\n"); else { for (int i=1; i<=N; i++) printf ("%c", ans[i]); printf ("\n"); } } return 0; } /*dp[0][0][0] = 1; for (int i=0; i<=N; i++) for (int j=0; j<=i; j++) for (int k=0; k<=i; k++) if (dp[i][j][k] > 0) { adto (dp[i + 1][j + 1][k + 1], dp[i][j][k]); int nj = j, nk = k; if (k > j) nk --; else nj --; if (nj >= 0) adto (dp[i + 1][nj][nk], dp[i][j][k]); } int tests; scanf ("%d", &tests); while (tests --) { scanf ("%d", &N); int ans = 0; for (int i=0; i<=N; i++) for (int j=0; j<=N; j++) ans += dp[i][j]; }*/ return 0; }

Compilation message (stderr)

parentrises.cpp: In function 'int main()':
parentrises.cpp:29:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
 scanf ("%d", &type);
 ~~~~~~^~~~~~~~~~~~~
parentrises.cpp:33:11: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf ("%d\n", &tests);
     ~~~~~~^~~~~~~~~~~~~~~~
parentrises.cpp:36:32: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf ("%s\n", sir + 1), N = strlen (sir + 1);
         ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#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...