Submission #1303165

#TimeUsernameProblemLanguageResultExecution timeMemory
1303165duckindogElection (BOI18_election)C++20
100 / 100
380 ms36536 KiB
#include <bits/stdc++.h> using namespace std; const int N = 500'000 + 10; int n, q; int a[N]; namespace IT { struct Node { int pref, suff, sum, best; Node(int pref = 0, int suff = 0, int sum = 0, int best = 0) : pref(pref), suff(suff), sum(sum), best(best) {} }; Node merge(const Node& lt, const Node& rt) { return Node(max(lt.pref, lt.sum + rt.pref), max(rt.suff, rt.sum + lt.suff), lt.sum + rt.sum, max({lt.best + rt.sum, lt.sum + rt.best, lt.pref + rt.suff})); } Node f[N << 2]; void build(int s, int l, int r) { if (l == r) { if (a[l] == 1) f[s] = Node(0, 0, -1, 0); else f[s] = Node(1, 1, 1, 1); return; } int mid = (l + r) >> 1; build(s << 1, l, mid); build(s << 1 | 1, mid + 1, r); f[s] = merge(f[s << 1], f[s << 1 | 1]); } Node query(int s, int l, int r, int u, int v) { if (v < l || u > r) return Node(); if (u <= l && r <= v) return f[s]; int mid = (l + r) >> 1; return merge(query(s << 1, l, mid, u, v), query(s << 1 | 1, mid + 1, r, u, v)); } } int32_t main() { cin.tie(0)->sync_with_stdio(0); cin >> n; for (int i = 1; i <= n; ++i) { char ch; cin >> ch; a[i] = (ch == 'C' ? 1 : -1); } IT::build(1, 1, n); cin >> q; while (q--) { int l, r; cin >> l >> r; cout << IT::query(1, 1, n, l, r).best << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...