Submission #1137361

#TimeUsernameProblemLanguageResultExecution timeMemory
1137361vuavisaoElection (BOI18_election)C++20
28 / 100
3092 ms2216 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") using namespace std; using ll = long long; const int N = 500'000 + 10; struct RMQ { int n, Lg; int specialValue; vector<vector<int>> rmq; function<int(int, int)> comb; RMQ() {}; RMQ(int _n, function<int(int, int)> _comb) : n(_n), comb(_comb) { assert(comb); Lg = __lg(n); rmq.resize(Lg + 5, vector<int>(n + 10, 0)); }; RMQ(int _n, int a[], function<int(int, int)> _comb) : n(_n), comb(_comb) { assert(comb); Lg = __lg(n); assert((1 << (Lg + 1)) > n); rmq.resize(Lg + 5, vector<int>(n + 10, 0)); apply(a); }; void apply(int a[]) { for (int i = 1; i <= n; ++ i) rmq[0][i] = a[i]; for (int lg = 1; lg <= Lg; ++ lg) { for (int i = 1; i + (1 << lg) - 1 <= n; ++ i) { rmq[lg][i] = comb(rmq[lg - 1][i], rmq[lg - 1][i + (1 << (lg - 1))]); } } } int getRmq(int l, int r) { if (l > r) return specialValue; int k = 31 - __builtin_clz(r - l + 1); return comb(rmq[k][l], rmq[k][r - (1 << k) + 1]); } void walk_on_rmq() { // custom } void setSpecialValue(int val) { specialValue = val; } }; int minComb(int lhs, int rhs) { return min(lhs, rhs); } int maxComb(int lhs, int rhs) { return max(lhs, rhs); } int gcdComb(int lhs, int rhs) { return __gcd(lhs, rhs); } int n, q; string s; pair<int, int> qq[N]; int mark[N]; int pred[N]; int res[N]; int temp[N]; void solve() { cin >> n >> s; for (int i = 1; i <= n; ++i) { mark[i] = (s[i - 1] == 'C' ? 1 : -1); } cin >> q; for (int i = 1; i <= q; ++i) { auto& [l, r] = qq[i]; cin >> l >> r; } for (int _ = 1; _ <= q; ++_) { const auto& [l, r] = qq[_]; for (int i = 1; i <= n; ++i) temp[i] = mark[i]; int sum = 0; for (int i = l; i <= r; ++i) { sum += temp[i]; if (sum < 0) { ++sum; ++res[_]; temp[i] = 0; } } // for (int i = 1; i <= n; ++i) cerr << temp[i] << " \n"[i == n]; // cerr << _ << ' ' << res[_] << '\n'; sum = 0; for (int i = r; i >= l; --i) { sum += temp[i]; if (sum < 0) { ++sum; ++res[_]; temp[i] = 0; } } } // for (int turn = 0; turn < 2; ++turn) { // for (int i = 1; i <= n; ++i) { // pred[i] = pred[i - 1] + mark[i]; // } // RMQ rmq(n, pred, minComb); // for (int i = 1; i <= q; ++i) { // auto& [l, r] = qq[i]; // res[i] = max(res[i], max(0, pred[l - 1] - rmq.getRmq(l, r))); // l = n - l + 1; // r = n - r + 1; // swap(l, r); // } // reverse(mark + 1, mark + 1 + n); // } for (int i = 1; i <= q; ++i) cout << res[i] << '\n'; } int32_t main() { std::ios_base::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); // int t; cin >> t; int t = 1; while (t-- > 0) { solve(); // cout << '\n'; } return (0 ^ 0); } /// Code by vuavisao
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...