Submission #1270286

#TimeUsernameProblemLanguageResultExecution timeMemory
1270286BigBadBullyElection (BOI18_election)C++20
0 / 100
3 ms832 KiB
#include <bits/stdc++.h> #define int long long #define pii pair<int, int> #define ff first #define ss second const int inf = 3e18; using namespace std; using ld = long double; /* struct seggy { int n; vector<int> tree; seggy(int sz) { n = sz; tree.resize(4*n,0); } int query(int l,int r,int L,int R,int idx) { if (l>R||r<L)return 0ll; if (l>=L&&r<=R)return tree[idx]; int mid = l+r>>1; return query(l,mid,L,R,2*idx)+query(mid+1,r,L,R,2*idx+1); } int query(int l,int r) { return query(0,n-1,l,r,1); } void update(int l,int r,int i,int x,int idx) { if (l>i||r<i)return; if(l==r) { tree[idx] = x; return; } int mid = l+r>>1; update(l,mid,i,x,2*idx); update(mid+1,r,i,x,2*idx+1); tree[idx] = tree[2*idx]+tree[2*idx+1]; } void update(int i,int x) { update(0,n-1,i,x,1); } }; */ struct lijen { int n; vector<int> tree, lazy; lijen(int sz) { n = sz; tree.resize(4 * n, 0); lazy.resize(4 * n, 0); } void pass(int l, int r, int idx) { if (lazy[idx] == 0) return; tree[idx] += lazy[idx]; if (l != r) { lazy[2 * idx] += lazy[idx]; lazy[2 * idx + 1] += lazy[idx]; } lazy[idx] = 0; } int query(int l, int r, int L, int R, int idx) { pass(l, r, idx); if (l > R || r < L) return inf; if (l >= L && r <= R) return tree[idx]; int mid = l + r >> 1; return min(query(l, mid, L, R, 2 * idx), query(mid + 1, r, L, R, 2 * idx + 1)); } int query(int l, int r) { return query(0, n - 1, l, r, 1); } void update(int l, int r, int L, int R, int x, int idx) { pass(l, r, idx); if (l > R || r < L) return; if (l >= L && r <= R) { lazy[idx] += x; pass(l, r, idx); return; } int mid = l + r >> 1; update(l, mid, L, R, x, 2 * idx); update(mid + 1, r, L, R, x, 2 * idx + 1); tree[idx] = min(tree[2 * idx], tree[2 * idx + 1]); } void update(int l, int r, int x) { if(l>r)return; update(0, n - 1, l, r, x, 1); } }; void solve() { int n; cin >> n; string s; cin >> s; vector<int> v(n, -1); for (int i = 0; i < n; i++) if (s[i] == 'C') v[i] += 2; int q; cin >> q; vector<array<int, 3>> quers(q); for (int i = 0; i < q; i++) cin >> quers[i][0] >> quers[i][1], quers[i][2] = i; sort(quers.begin(), quers.end()); vector<int> ans(q); for (auto &a : quers) a[0]--, a[1]--; vector<int> pref(n), suf(n); pref[0] = v[0]; for (int i = 1; i < n; i++) pref[i] = v[i] + pref[i - 1]; suf[n - 1] = v[n - 1]; for (int i = n - 2; i >= 0; i--) suf[i] = suf[i + 1] + v[i]; lijen mile(n), nane(n); for (int i = 0; i < n; i++) mile.update(i, i, suf[i]), nane.update(i, i, pref[i]); map<int, int> idx; map<int, vector<int>> idxs; for (int i = 0; i < n; i++) idxs[pref[i]].push_back(i); for (int i = -1; i >= -n; i--) if (idxs[i].size() > 0) mile.update(0, idxs[i][0], 1); int sum = 0; int j = 0; auto print = [&]() { for (int i = 0; i < n; i++) { cout << mile.query(i, i) << ' '; } cout << '\n'; for (int i = 0; i < n; i++) cout << nane.query(i, i) << ' '; cout << "\n\n"; }; for (int i = 0; i < n; i++) { //print(); while (j < q && quers[j][0] == i) { int l = quers[j][0], r = quers[j][1]; ans[quers[j][2]] = max(0ll, -(nane.query(l, r) - (l > 0 ? pref[l - 1] : 0))) + max(0ll, -(mile.query(l, r) - (r < n - 1 ? mile.query(r + 1, r + 1) : 0))); j++; } if (pref[i] < sum) { int p = idx[pref[i]]; if(p+1 >= idxs[pref[i]].size()) mile.update(0,idxs[pref[i]][p], -1); else mile.update(idxs[pref[i]][p]+1, idxs[pref[i]][p + 1], 1); } idx[pref[i]]++; if (idx[sum] < idxs[sum].size()) { int val = idxs[sum][idx[sum]]; if (v[i] < 0) mile.update(0, val, -1); else mile.update(0, val, 1); } sum += v[i]; } for (int x : ans) cout << x << '\n'; } signed main() { //ios::sync_with_stdio(0); int t = 1; // cin >> t; while (t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...