제출 #1274186

#제출 시각아이디문제언어결과실행 시간메모리
1274186domiElection (BOI18_election)C++20
0 / 100
17 ms31836 KiB
#include <bits/stdc++.h> #define int long long #define fi first #define se second #define sz(a) (int)((a).size()) #define all(a) (a).begin(), (a).end() #define lsb(x) (x & (-x)) #define vi vector<int> #define YES { cout << "YES" << endl; return; } #define NO { cout << "NO" << endl; return; } using ll = long long; using pii = std::pair<int, int>; const int NMAX = 5e5; using namespace std; vector<pii>qu[NMAX + 5]; vector<int>stk; char ch; int a[NMAX + 5], ans[NMAX + 5], n, q; ///cate numere din stk sunt >= l inline int cate(int l){ if (stk.empty()) return 0; auto it = lower_bound(all(stk), l); return distance(it, stk.end()); } struct Node{ int sum; int min_suf; Node () : sum(0), min_suf(INT_MAX) {} Node (int x) : sum(x), min_suf(x) {} static Node merge(const Node& left, const Node& right){ Node aux; aux.sum = left.sum + right.sum; aux.min_suf = min(right.min_suf, right.sum + left.min_suf); return aux; } }; struct ST{ Node aint[4 * NMAX + 5]; void build(int nod = 1, int st = 1, int dr = n){ if (st == dr){ aint[nod] = Node(a[st]); return; } int m = (st + dr) >> 1; build(2 * nod, st, m); build(2 * nod + 1, m + 1, dr); aint[nod] = Node::merge(aint[2 * nod], aint[2 * nod + 1]); } void update(int pos, int val, int nod = 1, int st = 1, int dr = n){ if (st == dr){ aint[nod] = Node(val); return; } int m = (st + dr) >> 1; if (pos <= m) update(pos, val, 2 * nod, st, m); else update(pos, val, 2 * nod + 1, m + 1, dr); aint[nod] = Node::merge(aint[2 * nod], aint[2 * nod + 1]); } Node query(int l, int r, int nod = 1, int st = 1, int dr = n){ if (st > r || dr < l) return Node(); if (l <= st && dr <= r) return aint[nod]; int m = (st + dr) >> 1; return Node::merge(query(l, r, 2 * nod, st, m), query(l, r, 2 * nod + 1, m + 1, dr)); } }aint; signed main() { cin.tie(nullptr)->sync_with_stdio(false); cin >> n; for (int i = 1; i <= n; ++i){ cin >> ch; a[i] = (ch == 'C' ? 1 : -1); } cin >> q; for (int i = 1, l, r; i <= q; ++i){ cin >> l >> r; qu[r].push_back({l, i}); } aint.build(); for (int i = 1, pref = 0; i <= n; ++i){ pref += a[i]; if (a[i] == -1 && pref < 0) { aint.update(i, 0); stk.push_back(i); ++pref; } if (a[i] == 1 && pref > 0 && !stk.empty()) { aint.update(stk.back(), -1); stk.pop_back(); --pref; } for (auto &[l, idx] : qu[i]) ans[idx] = cate(l) + abs(min(0LL, aint.query(l, i).min_suf)); } for (int i = 1; i <= q; ++i) cout << ans[i] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...