Submission #1268598

#TimeUsernameProblemLanguageResultExecution timeMemory
1268598aegparentrises (BOI18_parentrises)C++20
100 / 100
165 ms19172 KiB
#include <bits/stdc++.h> using namespace std; #define int int64_t constexpr int MOD = 1e9 + 7; int p, t; inline void solve() { string s; cin >> s; string ans; vector<pair<int, int>> rng(s.size() + 1, {0, 0}); for (int i = 1; i <= s.size(); i++) { if (s[i - 1] == '(') { rng[i] = {rng[i - 1].first + 1, rng[i - 1].second + 2}; } else { rng[i] = {max(rng[i - 1].first - 2, int(0)), rng[i - 1].second - 1}; if (rng[i].second < 0) goto impossible; } } if (rng.back().first > 0) goto impossible; { bool lasti = false; bool lastj = false; int curd = 0; for (int i = s.size() - 1; i >= 0; i--) { if (s[i] == '(') { if (curd - 2 >= rng[i].first) { ans.push_back('G'); curd -= 2; } else { ans.push_back(lasti ? 'B' : 'R'); curd--; lasti = lasti ? false : true; } } else { if (curd + 2 <= rng[i].second) { curd += 2; ans.push_back('G'); } else { ans.push_back(lastj ? 'B' : 'R'); curd++; lastj = lastj ? false : true; } } } } reverse(ans.begin(), ans.end()); cout << ans << '\n'; return; impossible: cout << "impossible\n"; return; } inline void solve1() { while (t--) solve(); } inline void solve2() { vector<vector<int>> dp1(610, vector<int>(610, 0)); vector<vector<int>> dp2(610, vector<int>(610, 0)); dp1[0][0] = 1; int cur = 0; auto iterate = [&]() -> void { for (int j = 0; j < 610; j++) { for (int k = j; k < 610; k++) { if (j + 2 < 610 && k + 1 < 610) dp2[j][k] += dp1[j + 2][k + 1]; if (j == 0 && k + 1 < 610) { dp2[j][k] += dp1[j + 1][k + 1]; dp2[j][k] += dp1[j][k + 1]; } if (j - 1 >= 0 && k - 2 >= 0) dp2[j][k] += dp1[j - 1][k - 2]; dp2[j][k] %= MOD; } } swap(dp1, dp2); for (int i = 0; i < 610; i++) fill(dp2[i].begin(), dp2[i].end(), 0); cur++; }; vector<pair<int, int>> queries(t); vector<int> ans(t, 0); for (int i = 0; i < t; i++) { cin >> queries[i].first; queries[i].second = i; } sort(queries.begin(), queries.end()); for (int i = 0; i < t; i++) { while (cur < queries[i].first) iterate(); int anss = 0; for (int i = 0; i < 610; i++) anss += dp1[0][i]; anss %= MOD; ans[queries[i].second] = anss; } copy(ans.begin(), ans.end(), ostream_iterator<int>(cout, "\n")); } signed main() { cin.tie(0)->sync_with_stdio(0); cin >> p >> t; if (p == 2) solve2(); else solve1(); }
#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...