Submission #1308011

#TimeUsernameProblemLanguageResultExecution timeMemory
1308011damagerElection (BOI18_election)C++20
0 / 100
1 ms332 KiB
#include <bits/stdc++.h> using namespace std; struct Node { int sum; int minPref; int minSuff; }; Node mergeNode(const Node &A, const Node &B) { Node res; res.sum = A.sum + B.sum; res.minPref = min(A.minPref, A.sum + B.minPref); res.minSuff = min(B.minSuff, B.sum + A.minSuff); return res; } class SegmentTree { private: int n; vector<Node> tree; void build(int idx, int l, int r, const vector<int> &arr) { if (l == r) { tree[idx].sum = arr[l]; tree[idx].minPref = min(0, arr[l]); tree[idx].minSuff = min(0, arr[l]); return; } int mid = (l + r) / 2; build(2 * idx, l, mid, arr); build(2 * idx + 1, mid + 1, r, arr); tree[idx] = mergeNode(tree[2 * idx], tree[2 * idx + 1]); } Node query(int idx, int l, int r, int ql, int qr) { if (ql > r || qr < l) { return {0, 0, 0}; } if (ql <= l && r <= qr) { return tree[idx]; } int mid = (l + r) / 2; Node left = query(2 * idx, l, mid, ql, qr); Node right = query(2 * idx + 1, mid + 1, r, ql, qr); return mergeNode(left, right); } public: SegmentTree(const vector<int> &arr) { n = arr.size(); tree.resize(4 * n); build(1, 0, n - 1, arr); } int getAnswer(int l, int r) { Node res = query(1, 0, n - 1, l, r); return max(-res.minPref, -res.minSuff); } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; string s; cin >> s; vector<int> arr(N); for (int i = 0; i < N; i++) { arr[i] = (s[i] == 'C' ? 1 : -1); } SegmentTree st(arr); int Q; cin >> Q; while (Q--) { int L, R; cin >> L >> R; cout << st.getAnswer(L - 1, R - 1) << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...