Submission #655392

#TimeUsernameProblemLanguageResultExecution timeMemory
655392bachhoangxuanStreet Lamps (APIO19_street_lamps)C++17
100 / 100
4212 ms63184 KiB
#include<bits/stdc++.h> using namespace std; #define maxn 300005 #define fi first #define se second typedef pair<int,int> pii; typedef vector<int> vi; struct query{ int t,a,b,id,pt; bool operator<(query o){ if(a!=o.a) return a>o.a; else return t>o.t; } }; bool cmp(query x,query y){ if(x.b!=y.b) return x.b<y.b; else return x.t>y.t; } struct segtre{ int tree[4*maxn],lazy[4*maxn]; void pushdown(int l,int r,int id){ if(lazy[id]==0) return; int mid=(l+r)>>1,lz=lazy[id];lazy[id]=0; lazy[id<<1]+=lz;lazy[id<<1|1]+=lz; tree[id<<1]+=lz*(mid-l+1);tree[id<<1|1]+=lz*(r-mid); } int query(int l,int r,int id,int p){ if(l==r) return tree[id]; pushdown(l,r,id); int mid=(l+r)>>1; if(p<=mid) return query(l,mid,id<<1,p); else return tree[id<<1]+query(mid+1,r,id<<1|1,p); } void update(int l,int r,int id,int tl,int tr,int val){ if(tr<l || r<tl) return; if(tl<=l && r<=tr){ lazy[id]+=val;tree[id]+=val*(r-l+1); return; } pushdown(l,r,id); int mid=(l+r)>>1; update(l,mid,id<<1,tl,tr,val);update(mid+1,r,id<<1|1,tl,tr,val); tree[id]=tree[id<<1]+tree[id<<1|1]; } }st; map<pii,vector<int>> mp; set<pii> s; int n,q,f[maxn],ans[maxn],sz; query que[maxn],qu[6*maxn]; //For each pair(l,r) find all time that l->r is all 1s and l-1,r+1 are 0s void get(int p,int t){ if(f[p]==1){ pii x=*(--s.upper_bound({p,n+2})); mp[x].push_back(t);s.erase(x); if(x.first==p && x.second>p+1){ x.first++;s.insert(x); mp[x].push_back(t); } else if(x.second==p+1 && x.first<p){ x.second--;s.insert(x); mp[x].push_back(t); } else if(x.second>p+1 && p>x.first){ s.insert({x.first,p});mp[{x.first,p}].push_back(t); s.insert({p+1,x.second});mp[{p+1,x.second}].push_back(t); } } else{ if(f[p-1]==0 && f[p+1]==0){ s.insert({p,p+1});mp[{p,p+1}].push_back(t); } else if(f[p-1]==1 && f[p+1]==0){ pii x=*(--s.lower_bound({p,n})); s.erase(x);mp[x].push_back(t); s.insert({x.first,p+1});mp[{x.first,p+1}].push_back(t); } else if(f[p-1]==0 && f[p+1]==1){ pii x=*s.upper_bound({p,n}); s.erase(x);mp[x].push_back(t); s.insert({p,x.second});mp[{p,x.second}].push_back(t); } else{ pii x1=*(--s.lower_bound({p,n})),x2=*s.upper_bound({p,n}); s.erase(x1);mp[x1].push_back(t); s.erase(x2);mp[x2].push_back(t); s.insert({x1.first,x2.second});mp[{x1.first,x2.second}].push_back(t); } } f[p]^=1; } void dnc(int l,int r){ if(l==r) return; int mid=(l+r)>>1; dnc(l,mid);dnc(mid+1,r); for(int i=l;i<=mid;i++) qu[i].pt=1; for(int i=mid+1;i<=r;i++) qu[i].pt=2; sort(qu+l,qu+r+1,cmp); //cout << l << ' ' << r << '\n'; for(int i=r;i>=l;i--){ if(qu[i].pt==2 && qu[i].t==1){ int k=0,pre=0; for(int x:mp[{qu[i].a,qu[i].b}]){ k++; if(k&1) pre=x; else{ st.update(1,q+1,1,pre,x-1,1); } } } else if(qu[i].pt==1 && qu[i].t==2) ans[qu[i].id]+=st.query(1,q+1,1,qu[i].id); //cout << "{ " << qu[i].t << ' ' << qu[i].a << ' ' << qu[i].b << ' ' << qu[i].id << ' ' << qu[i].pt << ' ' << ans[qu[i].id] << "}\n"; } for(int i=l;i<=r;i++){ if(qu[i].pt==2 && qu[i].t==1){ int k=0,pre=0; for(int x:mp[{qu[i].a,qu[i].b}]){ k++; if(k&1) pre=x; else st.update(1,q+1,1,pre,x-1,-1); } } } } //Main signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL); cin >> n >> q; int l=-1; for(int i=1;i<=n;i++){ char c;cin >> c; f[i]=c-'0'; if(f[i]==1){ if(l==-1) l=i; } else if(l!=-1){s.insert({l,i});l=-1;} } if(l!=-1) s.insert({l,n+1}); for(auto x:s) mp[x].push_back(1); //for(pii x:s) cout << "{ " << x.first << ' ' << x.second << "} "; //cout << '\n'; for(int i=1;i<=q;i++){ string ss;cin >> ss; if(ss[0]=='t'){ que[i].t=1;que[i].id=i; cin >> que[i].a; get(que[i].a,i+1); } else{ que[i].t=2;que[i].id=i; cin >> que[i].a >> que[i].b; } //for(pii x:s) cout << "{ " << x.first << ' ' << x.second << "} "; //cout << '\n'; } for(auto &x:mp){ qu[++sz]={1,x.fi.fi,x.fi.se,0,0}; if((int)x.second.size()&1) x.second.push_back(q+2); //cout << x.fi.fi << '*' << x.fi.se << '\n'; //for(int v:x.second) cout << v << ' '; //cout << '\n'; } for(int i=1;i<=q;i++){ if(que[i].t==2) qu[++sz]=que[i]; } sort(qu+1,qu+sz+1); /* for(int i=1;i<=sz;i++){ cout << "{ " << qu[i].t << ' ' << qu[i].a << ' ' << qu[i].b << ' ' << qu[i].id << ' ' << qu[i].pt << "}\n"; } */ dnc(1,sz); for(int i=1;i<=q;i++){ if(que[i].t==2) cout << ans[i] << '\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...