Submission #1158516

#TimeUsernameProblemLanguageResultExecution timeMemory
115851612345678Street Lamps (APIO19_street_lamps)C++17
100 / 100
2089 ms80480 KiB
#include <bits/stdc++.h> using namespace std; const int nx=3e5+5; #define ll long long struct points { ll l, r, t, type, idx; points(ll l=0, ll r=0, ll t=0, ll type=0): l(l), r(r), t(t), type(type){} bool operator<(const points &o) const { if (l!=o.l) return l<o.l; if (r!=o.r) return r>o.r; return t<o.t; } }; ll n, q, open[nx], qrs[nx], a, b, l, r, lst, on, res[nx], cnt[nx], sz; string opr, str; set<pair<ll, ll>> rng; vector<points> p, tmp; struct segtree { pair<ll, ll> d[12*nx]; pair<ll, ll> sum(pair<ll, ll> l, pair<ll,ll> r) { return {l.first+r.first, l.second+r.second}; } void update(int l, int r, int i, int idx, pair<ll, ll> vl) { if (idx<l||r<idx) return; if (l==r) return d[i]=sum(d[i], vl), void(); int md=(l+r)/2; update(l, md, 2*i, idx, vl); update(md+1, r, 2*i+1, idx, vl); d[i]=sum(d[2*i], d[2*i+1]); } pair<ll, ll> query(int l, int r, int i, int ql, int qr) { if (qr<l||r<ql) return {0, 0}; if (ql<=l&&r<=qr) return d[i]; int md=(l+r)/2; return sum(query(l, md, 2*i, ql, qr), query(md+1, r, 2*i+1, ql, qr)); } } s; void solve(int l, int r) { if (l==r) return; int md=(l+r)/2; solve(l, md); solve(md+1, r); int idxl=l, idxr=md+1, idx=l; //cout<<"solve "<<l<<' '<<r<<'\n'; while (idxl<=md||idxr<=r) { if (idxr>r||(idxl<=md&&p[idxl].r>=p[idxr].r)) { if (p[idxl].type!=0) s.update(0, sz-1, 1, p[idxl].t, {p[idxl].t*p[idxl].type, p[idxl].type}); tmp[idx]=p[idxl]; idx++; idxl++; } else { if (p[idxr].type==0) { auto ans=s.query(0, sz-1, 1, 0, p[idxr].t); res[p[idxr].t]+=ans.first; cnt[p[idxr].t]+=ans.second; } tmp[idx]=p[idxr]; idx++; idxr++; } } for (int i=l; i<=md; i++) if (p[i].type!=0) s.update(0, sz-1, 1, p[i].t, {-p[i].t*p[i].type, -p[i].type}); for (int i=l; i<=r; i++) p[i]=tmp[i]; } int main() { cin.tie(NULL)->sync_with_stdio(false); cin>>n>>q>>str; str=' '+str+'0'; for (int i=1; i<=n+1; i++) { if (str[i]=='0') { if (on) { rng.insert({lst, i-1}); p.push_back(points(lst, i-1, 0, -1)); on=0; } } else if (!on) on=1, lst=i; } for (int i=1; i<=n; i++) open[i]=str[i]=='1'; for (int i=1; i<=q; i++) { cin>>opr; if (opr[0]=='t') { cin>>a; if (open[a]) { auto vl=*prev(rng.upper_bound(make_pair(a, INT_MAX))); rng.erase(vl); p.push_back(points(vl.first, vl.second, i, 1)); if (a!=vl.first) p.push_back(points(vl.first, a-1, i, -1)), rng.insert({vl.first, a-1}); if (a!=vl.second) p.push_back(points(a+1, vl.second, i, -1)), rng.insert({a+1, vl.second}); } else { l=r=a; auto itrr=rng.upper_bound(make_pair(a, INT_MAX)); if (itrr!=rng.end()&&itrr->first==a+1) { r=itrr->second; p.push_back(points(itrr->first, itrr->second, i, 1)); rng.erase(itrr); } auto itrl=rng.upper_bound(make_pair(a, INT_MAX)); if (itrl!=rng.begin()&&(--itrl)->second==a-1) { l=itrl->first; p.push_back(points(itrl->first, itrl->second, i, 1)); rng.erase(itrl); } rng.insert({l, r}); p.push_back(points(l, r, i, -1)); } open[a]=!open[a]; } else { qrs[i]=i; cin>>a>>b; p.push_back(points(a, b-1, i, 0)); } } //for (auto x:p) cout<<x.l<<' '<<x.r<<' '<<x.t<<' '<<x.type<<'\n'; sort(p.begin(), p.end()); //for (auto x:p) cout<<x.l<<' '<<x.r<<' '<<x.t<<' '<<x.type<<'\n'; sz=p.size(); tmp.resize(p.size()); solve(0, sz-1); for (int i=1; i<=q ;i++) { if (qrs[i]) { //cout<<"res "<<res[i]<<'\n'; if (cnt[i]!=0) cout<<res[i]+qrs[i]<<'\n'; else cout<<res[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...