제출 #1147282

#제출 시각아이디문제언어결과실행 시간메모리
1147282Math4Life2020Weirdtree (RMI21_weirdtree)C++20
0 / 100
2114 ms412668 KiB
#include "weirdtree.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll,ll>; const ll Nm = (1<<19); const ll E = 19; const ll INF = 2e9; map<int,int> stn[2*Nm]; ll stm[2*Nm]; ll sts[2*Nm]; ll lz[2*Nm]; ll N; void initialise(int _N, int _Q, int h0[]) { N = _N; for (ll i=0;i<N;i++) { stn[i+Nm][h0[i+1]]=1; lz[i+Nm]=INF; sts[i+Nm]=h0[i]; stm[i+Nm]=h0[i]; } for (ll i=N;i<Nm;i++) { stn[i+Nm][0]=1; lz[i+Nm]=INF; sts[i+Nm]=0; stm[i+Nm]=0; } for (ll p=(Nm-1);p>=1;p--) { for (pii p0: stn[2*p]) { stn[p][p0.first]+=p0.second; } for (pii p0: stn[2*p+1]) { stn[p][p0.first]+=p0.second; } sts[p]=sts[2*p]+sts[2*p+1]; stm[p]=max(stm[2*p],stm[2*p+1]); lz[p]=INF; } // for (ll p=1;p<(2*Nm);p++) { // cout << "sts[p="<<p<<"]="<<sts[p]<<"\n"; // } } void lft(ll h0, ll hf, ll qt, ll p) { //DO NOT PUSH DOWN if (p==0) { return; } sts[p]+=qt*(hf-h0); stn[p][hf]+=qt; stn[p][h0]-=qt; if (stn[p][h0]==0) { stn[p].erase(h0); } stm[p]=(*(--stn[p].end())).first; lft(h0,hf,qt,p/2); } void pdn(ll p) { if (p==0 || lz[p]==INF) { return; } while (!stn[p].empty()) { auto A0 = --stn[p].end(); pii pf = *A0; if (pf.first<=lz[p]) { break; } else { //cout << "push down pdn at p="<<p<<"\n"; //cout << "lz[p]="<<lz[p]<<", pf="<<pf.first<<","<<pf.second<<"\n"; sts[p]-=(pf.first-lz[p])*pf.second; stm[p]=lz[p]; stn[p].erase(A0); stn[p][lz[p]]+=pf.second; } } if (p<Nm) { lz[2*p]=min(lz[2*p],lz[p]); lz[2*p+1]=min(lz[2*p+1],lz[p]); } lz[p]=INF; } inline ll v2(ll x) { return __builtin_ctz(x); } void cut2(ll p, ll mval, ll k) { //cout << "cut2: p,mval,k="<<p<<","<<mval<<","<<k<<"\n"; if (k==0) { return; } for (ll e=E;e>=0;e--) { pdn(p>>e); } if (stn[p][mval]==k) { lft(mval,mval-1,k,p); lz[p]=mval-1; return; } assert(p<Nm); if (stn[2*p].find(mval)==stn[2*p].end()) { cut2(2*p+1,mval,k); } else if (stn[2*p][mval]>=k) { cut2(2*p,mval,k); } else { cut2(2*p+1,mval,k-stn[2*p][mval]); //cout << "loopbk\n"; cut2(2*p,mval,stn[2*p][mval]); } } void cut(int l, int r, int k) { if (k==0) { return; } l--; r--; ll l0 = l; ll r0 = r; ll mval = 0; vector<pii> vc; while (l0<=r0) { ll vl = v2(l0); ll vr = v2(r0+1); if (vl<vr) { ll p0 = (l0>>vl)+(1<<(E-vl)); for (ll e=E;e>=0;e--) { pdn(p0>>e); } if (stm[p0]>mval) { vc.clear(); mval = stm[p0]; } if (stm[p0]==mval) { vc.push_back({l,p0}); } l0+=(1<<vl); } else { ll p0 = (r0>>vr)+(1<<(E-vr)); for (ll e=E;e>=0;e--) { pdn(p0>>e); } if (stm[p0]>mval) { vc.clear(); mval = stm[p0]; } if (stm[p0]==mval) { vc.push_back({r,p0}); } r0-=(1<<vr); } } if (mval==0) { return; } sort(vc.begin(),vc.end()); for (pii PQ: vc) { if (k==0) { return; } ll p0 = PQ.second; if (stn[p0][mval]<=k) { k -= stn[p0][mval]; lz[p0]=min(lz[p0],mval-1); lft(mval,mval-1,stn[p0][mval],p0); } else { cut2(p0,mval,k); k=0; } } cut(l+1,r+1,k); } void magic(int i, int x) { i--; for (ll e=E;e>=0;e--) { pdn((i>>e)+(1<<(E-e))); } ll ht0 = (*stn[i+Nm].begin()).first; lft(ht0,x,1,i+Nm); } ll inspect(int l, int r) { ll fval = 0; l--; r--; ll l0=l; ll r0=r; while (l0<=r0) { ll vl = v2(l0); ll vr = v2(r0+1); if (vl<vr) { ll p0 = (l0>>vl)+(1<<(E-vl)); for (ll e=E;e>=0;e--) { pdn(p0>>e); } fval += sts[p0]; l0 += (1<<vl); } else { ll p0 = (r0>>vr)+(1<<(E-vr)); for (ll e=E;e>=0;e--) { pdn(p0>>e); } fval += sts[p0]; r0 -= (1<<vr); } } return fval; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...