Submission #331759

#TimeUsernameProblemLanguageResultExecution timeMemory
331759smaxElection (BOI18_election)C++17
0 / 100
2 ms492 KiB
#include <bits/stdc++.h> using namespace std; #ifdef LOCAL #define DEBUG(...) debug(#__VA_ARGS__, __VA_ARGS__); #else #define DEBUG(...) 6; #endif template<typename T, typename S> ostream& operator << (ostream &os, const pair<T, S> &p) {return os << "(" << p.first << ", " << p.second << ")";} template<typename C, typename T = decay<decltype(*begin(declval<C>()))>, typename enable_if<!is_same<C, string>::value>::type* = nullptr> ostream& operator << (ostream &os, const C &c) {bool f = true; os << "["; for (const auto &x : c) {if (!f) os << ", "; f = false; os << x;} return os << "]";} template<typename T> void debug(string s, T x) {cerr << s << " = " << x << "\n";} template<typename T, typename... Args> void debug(string s, T x, Args... args) {cerr << s.substr(0, s.find(',')) << " = " << x << " | "; debug(s.substr(s.find(',') + 2), args...);} struct Node { int tot, lmin, rmin; void leaf(char c) { tot = lmin = rmin = c == 'C' ? 1 : -1; } void pull(Node &a, Node &b) { tot = a.tot + b.tot; lmin = min(a.lmin + b.tot, b.lmin); rmin = min(a.rmin, a.tot + b.rmin); } }; struct SegmentTree { int n; string s; vector<Node> st; SegmentTree(int _n) : n(_n), st(4*n) { build(1, 0, n-1); } SegmentTree(const string &_s) : n(_s.size()), s(_s), st(4*n) { build(1, 0, n-1); } void build(int p, int l, int r) { if (l == r) { st[p].leaf(s[l]); return; } int m = (l + r) / 2; build(2*p, l, m); build(2*p+1, m+1, r); st[p].pull(st[2*p], st[2*p+1]); } Node query(int p, int l, int r, int i, int j) { if (l == i && r == j) return st[p]; int m = (l + r) / 2; if (j <= m) return query(2*p, l, m, i, j); else if (i > m) return query(2*p+1, m+1, r, i, j); Node ret, ls = query(2*p, l, m, i, m), rs = query(2*p+1, m+1, r, m+1, j); ret.pull(ls, rs); return ret; } int query(int i, int j) { Node ret = query(1, 0, n-1, i, j); return -min(ret.lmin, ret.rmin); } }; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n, q; string s; cin >> n >> s >> q; SegmentTree st(s); for (int i=0; i<q; i++) { int l, r; cin >> l >> r; l--, r--; cout << max(st.query(l, r), 0) << "\n"; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...