Submission #365430

#TimeUsernameProblemLanguageResultExecution timeMemory
365430tfgparentrises (BOI18_parentrises)C++17
100 / 100
91 ms110700 KiB
#include <iostream> #include <vector> #include <chrono> #include <random> #include <cassert> std::mt19937 rng((int) std::chrono::steady_clock::now().time_since_epoch().count()); bool good(const std::string &str) { int bal = 0; for(auto ch : str) { bal += ch == '(' ? 1 : -1; if(bal < 0) return false; } return bal == 0; } void solve1() { int t; std::cin >> t; while(t--) { std::string str; std::cin >> str; int n = (int) str.size(); std::vector<int> pos[2]; std::vector<int> col(n, 3); int bst = 0, sum = 0; for(int i = 0; i < n; i++) { pos[str[i] == '('].push_back(i); sum += str[i] == '(' ? 1 : -1; bst = std::min(bst, sum); } int bal = (int) pos[1].size() - (int) pos[0].size(); if(bst < 0) { bal -= bst; bst = -bst; for(int i = 0; i < 2*bst && i < (int) pos[0].size(); i++) { col[pos[0][i]] = i % 2 == 0 ? 1 : 2; } } if(bal > 0) { for(int i = 0; i < 2*bal && i < (int) pos[1].size(); i++) { col[pos[1][(int) pos[1].size() - i - 1]] = i % 2 == 0 ? 1 : 2; } } std::string haha[2]; for(int i = 0; i < n; i++) { if(col[i] & 1) haha[0] += str[i]; if(col[i] & 2) haha[1] += str[i]; } if(good(haha[0]) && good(haha[1])) { for(int i = 0; i < n; i++) { char ch; if(col[i] == 3) { ch = 'G'; } else if(col[i] == 1) { ch = 'R'; } else { ch = 'B'; } std::cout << ch; } std::cout << '\n'; } else { std::cout << "impossible\n"; } } } const int ms = 303; const int MOD = 1e9 + 7; long long dp[ms][ms][ms]; long long catalan[ms]; long long wtf[ms]; void solve2() { int t; std::cin >> t; catalan[0] = 1; for(int i = 2; i < ms; i += 2) { for(int j = 0; j < i; j += 2) { catalan[i] = (catalan[i] + catalan[j] * catalan[i-j-2]) % MOD; } } dp[0][0][0] = 1; for(int i = 0; i+1 < ms; i++) { for(int sum = 0; sum <= i; sum++) { for(int mx = 0; mx <= i; mx++) { dp[i][sum][mx] %= MOD; dp[i+1][sum+1][mx] += dp[i][sum][mx]; if(sum > 0) { dp[i+1][sum-1][mx+1] += dp[i][sum][mx]; } else if(mx > 0) { wtf[i+1] = (dp[i][sum][mx] + wtf[i+1]) % MOD; dp[i+1][sum][mx-1] += dp[i][sum][mx]; } } } } wtf[0] = 1; while(t--) { int n; std::cin >> n; long long ans = 0; for(int i = 0; i <= n; i++) { for(int j = 0; i+j <= n; j += 2) { ans = (ans + wtf[i] * catalan[j] % MOD * wtf[n-i-j]) % MOD; } } std::cout << ans << '\n'; } } int main() { std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int P; std::cin >> P; if(P == 1) { solve1(); } else { solve2(); } }
#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...