Submission #1309099

#TimeUsernameProblemLanguageResultExecution timeMemory
1309099namhh가로등 (APIO19_street_lamps)C++20
100 / 100
1030 ms67608 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define pii pair<int,int> #define fi first #define se second const int N = 3e5+5; int n,q,bits[2][N],val[N],ans[N]; string s; vector<int>qr; struct events{ int id,l,r,t; }; vector<events>loj; bool cmp(events a, events b){ return a.t < b.t; } bool cmp1(events a, events b){ return a.r > b.r; } void update(int id, int u, int val){ while(u <= n){ bits[id][u] += val; u += u & (-u); } } int get(int id, int u){ int sum = 0; while(u > 0){ sum += bits[id][u]; u -= u & (-u); } return sum; } set<int>st; int cnp(int u){ int l = 0; int r = loj.size()-1; int ans = loj.size(); while(l <= r){ int mid = (l+r)/2; if(loj[mid].t >= u){ ans = mid; r = mid-1; } else l = mid+1; } return ans; } void dnc(int l, int r){ if(l == r) return; int mid = (l+r)/2; dnc(l,mid); dnc(mid+1,r); int l1 = cnp(l); int r1 = cnp(mid+1)-1; if(l1 > r1) return; int l2 = r1+1; int r2 = cnp(r+1)-1; vector<events>diddy1,diddy2; for(int i = l1; i <= r1; i++){ if(loj[i].id != 0) diddy1.push_back(loj[i]); } for(int i = l2; i <= r2; i++){ if(loj[i].id == 0) diddy2.push_back(loj[i]); } sort(diddy1.begin(),diddy1.end(),cmp1); sort(diddy2.begin(),diddy2.end(),cmp1); int ptr = 0; for(auto[id,l3,r3,t]: diddy2){ while(ptr < (int)diddy1.size() && diddy1[ptr].r >= r3){ auto[id1,l4,r4,t1] = diddy1[ptr]; update(0,l4,id1); update(1,l4,t1*id1); ptr++; } ans[t] += get(0,l3)*t-get(1,l3); } for(int i = ptr-1; i >= 0; i--){ auto[id,l3,r3,t] = diddy1[i]; update(0,l3,-id); update(1,l3,-t*id); } } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q >> s; s = "#"+s; for(int i = 1; i <= n; i++){ if(s[i] == '0') st.insert(i); } st.insert(0); st.insert(n+1); for(int i = 1; i <= q; i++){ string type; cin >> type; if(type == "toggle"){ int u; cin >> u; if(s[u] == '0'){ auto y = st.upper_bound(u); auto x = st.lower_bound(u); --x; int l = *x; int r = *y; if(l < u-1){ int dm = val[l]; loj.push_back({1,l+1,u,dm}); loj.push_back({-1,l+1,u,i}); } if(u < r-1){ int dm = val[u]; loj.push_back({1,u+1,r,dm}); loj.push_back({-1,u+1,r,i}); } val[l] = i; st.erase(u); s[u] = '1'; } else{ auto y = st.upper_bound(u); auto x = st.lower_bound(u); --x; int l = *x; int r = *y; int dm = val[l]; loj.push_back({1,l+1,r,dm}); loj.push_back({-1,l+1,r,i}); val[l] = val[u] = i; st.insert(u); s[u] = '0'; } } else{ int l,r; cin >> l >> r; loj.push_back({0,l,r,i}); qr.push_back(i); } } vector<int>v; auto l = st.begin(); while(l != st.end()){ v.push_back(*l); ++l; } for(int i = 1; i < (int)v.size(); i++){ if(v[i-1] == v[i]-1) continue; int dm = val[v[i-1]]; loj.push_back({1,v[i-1]+1,v[i],dm}); loj.push_back({-1,v[i-1]+1,v[i],q+1}); } sort(loj.begin(),loj.end(),cmp); dnc(0,qr.back()); for(auto it: qr) cout << ans[it] << "\n"; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...