Submission #1270277

#TimeUsernameProblemLanguageResultExecution timeMemory
1270277BigBadBullyElection (BOI18_election)C++20
0 / 100
4 ms1088 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) { 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 = -n; i <= n; i++) idxs[i].push_back(n); for (int i = -1; i >= -n; i--) if (idxs[i].size()>1) 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]]; mile.update(idxs[pref[i]][p],idxs[pref[i]][p+1]-1,1); } idx[pref[i]]++; if (idx[sum] >= idxs[sum].size()-1)continue; 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...