Submission #1240457

#TimeUsernameProblemLanguageResultExecution timeMemory
1240457MateiKing80Election (BOI18_election)C++20
100 / 100
726 ms22260 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500005; struct node { int l, r, ans, sum; } aint[4 * N + 5]; node join(node a, node b) { node c; c.l = max(a.l, a.sum + b.l); c.r = max(b.r, b.sum + a.r); c.sum = a.sum + b.sum; c.ans = max({a.ans + b.sum, a.sum + b.ans, a.l + b.r}); return c; } void build(int pos, int st, int dr, string &s) { if (st == dr) { if (s[st - 1] == 'C') aint[pos] = {0, 0, 0, -1}; else aint[pos] = {1, 1, 1, 1}; return; } int mid = (st + dr) >> 1; build (2 * pos, st, mid, s); build (2 * pos + 1, mid + 1, dr, s); aint[pos] = join(aint[2 * pos], aint[2 * pos + 1]); } node query(int pos, int st, int dr, int l, int r) { if (l <= st && dr <= r) return aint[pos]; int mid = (st + dr) >> 1; if (r <= mid) return query(2 * pos, st, mid, l, r); else if (mid < l) return query(2 * pos + 1, mid + 1, dr, l, r); return join(query(2 * pos, st, mid, l, r), query(2 * pos + 1, mid + 1, dr, l, r)); } signed main() { int n; cin >> n; string s; cin >> s; build(1, 1, n, s); int q; cin >> q; vector<int> last(n, q + 1); while (q --) { int l, r; cin >> l >> r; cout << query(1, 1, n, l, r).ans << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...