제출 #1190031

#제출 시각아이디문제언어결과실행 시간메모리
1190031user736482Modern Machine (JOI23_ho_t5)C++20
100 / 100
2172 ms231124 KiB
#pragma GCC optimize("O3,unroll-loops,inline") #pragma GCC target("avx2") #include <bits/stdc++.h> using namespace std; #define ll long long #define ld long double #define pb push_back #define ff first #define ss second #define MOD 1000000009 #define INF 1000000019 #define POT (1<<18) #define INFL ((ll)INF*(ll)INF) ll n,q,t,a,b,c,k,e,m,h,w,u,pier,sufsz,ak2=POT,ak3=POT; vector<ll>kras,sufl={0},prefr={0}; vector<pair<pair<ll,ll>,pair<ll,ll>>>zap; vector<pair<ll,ll>>vpom,nxt; string s; ll pierwszy[120007],smpref[120007],smsuf[120007],ans[120007],gdziel[120007],gdzier[120007]; vector<pair<pair<ll,ll>,ll>>sgtree[POT]; ll sg1[POT]; ll sg2[10000000],sg3[10000000]; ll lw2[10000000],pw2[10000000],lw3[10000000],pw3[10000000]; ll rot2[120007],rot3[120007]; void upd(ll v,ll val){ sg1[v]=val; v/=2; while(v){ sg1[v]=min(sg1[v*2],sg1[v*2+1]); v/=2; } } ll mn(ll pocz,ll kon,ll l,ll r,ll v){ if(pocz>r || kon<l)return INFL; if(pocz<=l && kon>=r)return sg1[v]; return min(mn(pocz,kon,l,(l+r)/2,v*2),mn(pocz,kon,(l+r)/2+1,r,v*2+1)); } ll sm2(ll pocz,ll kon,ll l ,ll r,ll v){ if(pocz>r || kon<l)return 0; if(pocz<=l && kon>=r)return sg2[v]; return sm2(pocz,kon,l,(l+r)/2,lw2[v])+sm2(pocz,kon,(l+r)/2+1,r,pw2[v]); } ll sm3(ll pocz,ll kon,ll l ,ll r,ll v){ if(pocz>r || kon<l)return 0; if(pocz<=l && kon>=r)return sg3[v]; return sm3(pocz,kon,l,(l+r)/2,lw3[v])+sm3(pocz,kon,(l+r)/2+1,r,pw3[v]); } ll upd2(ll l,ll r,ll gdzie,ll v,ll val){ if(l==r)sg2[ak2]=val; else{ ll pom; if((l+r)/2>=gdzie){ pom=upd2(l,(l+r)/2,gdzie,lw2[v],val); pw2[ak2]=pw2[v]; lw2[ak2]=pom; } else{ pom=upd2((l+r)/2+1,r,gdzie,pw2[v],val); lw2[ak2]=lw2[v]; pw2[ak2]=pom; } sg2[ak2]=sg2[lw2[ak2]]+sg2[pw2[ak2]]; } return ak2++; } ll upd3(ll l,ll r,ll gdzie,ll v,ll val){ if(l==r)sg3[ak3]=val; else{ ll pom; if((l+r)/2>=gdzie){ pom=upd3(l,(l+r)/2,gdzie,lw3[v],val); pw3[ak3]=pw3[v]; lw3[ak3]=pom; } else{ pom=upd3((l+r)/2+1,r,gdzie,pw3[v],val); lw3[ak3]=lw3[v]; pw3[ak3]=pom; } sg3[ak3]=sg3[lw3[ak3]]+sg3[pw3[ak3]]; } return ak3++; } pair<ll,ll>operacja(ll x,ll pref,ll suf){ x--; ll polewej=prefr[min(x,n-suf)]-prefr[min(pref,x)]+min(pref,x); ll poprawej=sufl[max(x+1,pref)]-sufl[n-min(suf,n-x-1)]+min(suf,n-x-1); if(polewej>=poprawej){ ll pom; if(-prefr[pref]+prefr[min(x,n-suf)]>poprawej){ pom=gdzier[1+prefr[min(x,n-suf)]-(poprawej-1)-1]+1; } else{ if(pref>x){ pom=x-poprawej; } else pom=(pref)-(poprawej-(prefr[min(x,n-suf)]-prefr[pref])); } return{min(pom,pref),n-pom}; } else{ ll pom; polewej++; if(-sufl[n-suf]+sufl[1+max(x,pref-1)]>polewej){ pom=gdziel[1+sufl[1+max(x,pref-1)]-(polewej-1)-1]-1; } else{ if(suf>=n-x){ pom=x+polewej;} else pom=n-suf-1+polewej+sufl[n-suf]-sufl[1+max(x,pref-1)]; } return{pom+1,min(suf,n-pom-1)}; } } ll brt(ll pref,ll suf,ll pocz,ll kon){ if(pocz>kon){ return pref+prefr[n-suf]-prefr[pref]; } auto pom=operacja(kras[pocz],pref,suf); return brt(pom.ff,pom.ss,pocz+1,kon); } ll policz(ll ak,ll pocz,ll kon,ll l,ll r,ll v){ if(kon<l || r<pocz)return ak; if(l>=pocz && r<=kon){ return (ak+(*--lower_bound(sgtree[v].begin(),sgtree[v].end(),(pair<pair<ll,ll>,ll>){{ak,INF},INF})).ss)%(n+1); } ll pom=policz(ak,pocz,kon,l,(l+r)/2,v*2); return policz((pom),pocz,kon,(l+r)/2+1,r,v*2+1); } ll policzsmsuf(ll pref,ll l,ll r){ return sm3(l+1,r,1,POT/2,rot3[n-pref]); ll rt=0; for(ll j=l;j<r;j++){ if(kras[j]>pref){ rt+=n-kras[j]; } } return rt; } ll policzsmpref(ll pref,ll l,ll r){ return sm2(l+1,r,1,POT/2,rot2[pref]); ll rt=0; for(ll j=l;j<r;j++){ if(kras[j]<=pref){ rt+=kras[j]; } } return rt; } int main() { ios_base::sync_with_stdio(0);cin.tie(0); for(ll i=1;i<POT/2;i++){ lw2[i]=i*2; pw2[i]=lw2[i]+1; lw3[i]=i*2; pw3[i]=lw3[i]+1; } rot2[0]=1; rot3[0]=1; vector<pair<ll,ll>>pomm; cin>>n>>m; cin>>s; pier=n; for(ll i=0;i<n;i++){ if(s[i]=='R')s[i]='>'; if(s[i]=='B')s[i]='<'; prefr.pb(prefr.back()); if(s[i]=='>'){ prefr.back()++; gdzier[1+prefr.back()]=i; } } gdzier[1+0]=-1; gdzier[1+-1]=-INFL; for(ll i=n-1;i>=0;i--){ sufl.pb(sufl.back()); if(s[i]=='<'){ sufl.back()++; gdziel[1+sufl.back()]=i; } } gdziel[1+-1]=INFL; gdziel[1+sufl.back()+1]=n; gdziel[1+0]=n; reverse(sufl.begin(),sufl.end()); for(ll i=0;i<n;i++){ if(s[i]=='<'){ pier=i; break; } } sufsz=0; for(ll i=n-1;i>=0;i--){ if(s[i]=='<'){ sufsz++; } else break; } for(ll i=0;i<m;i++){ cin>>a; pomm.pb({a,i}); kras.pb(a); } pomm.pb({0,-1}); pomm.pb({n+1,-1}); sort(pomm.begin(),pomm.end()); for(ll i=1;i<=m;i++){ rot2[pomm[i].ff]=upd2(1,POT/2,1+pomm[i].ss,rot2[pomm[i-1].ff],pomm[i].ff); } for(ll i=1;i<=n;i++){ rot2[i]=max(rot2[i],rot2[i-1]); } for(ll i=m;i>0;i--){ rot3[n-pomm[i].ff+1]=upd3(1,POT/2,1+pomm[i].ss,rot3[n-pomm[i+1].ff+1],n-pomm[i].ff); } for(ll i=1;i<=n;i++){ rot3[i]=max(rot3[i],rot3[i-1]); } for(ll i=0;i<m;i++){ sgtree[i+POT/2].pb({{0,kras[i]-1},kras[i]+1}); sgtree[i+POT/2].pb({{kras[i],n},kras[i]}); } for(ll i=m;i<POT/2;i++){ sgtree[i+POT/2].pb({{0,n},0}); } for(ll i=POT/2-1;i>0;i--){ vector<pair<pair<ll,ll>,ll>>v=sgtree[i*2],v2; if(i==1)break; for(ll j=0;j<v.size();j++){ if((v[j].ff.ff+v[j].ss)%(n+1)<=(v[j].ff.ss+v[j].ss)%(n+1)) v2.pb({{(v[j].ff.ff+v[j].ss)%(n+1),(v[j].ff.ss+v[j].ss)%(n+1)},v[j].ss%(n+1)}); else{ v2.pb({{(v[j].ff.ff+v[j].ss)%(n+1),n},v[j].ss%(n+1)}); v2.pb({{0,(v[j].ff.ss+v[j].ss)%(n+1)},v[j].ss%(n+1)}); } } sort(v2.begin(),v2.end()); for(auto j : v2){ } for(ll j=0;j<v2.size();j++){ ll ak=lower_bound(sgtree[i*2+1].begin(),sgtree[i*2+1].end(),(pair<pair<ll,ll>,ll>){{v2[j].ff.ss,INF},INF})-sgtree[i*2+1].begin()-1; while(ak>=0 && sgtree[i*2+1][ak].ff.ss>=v2[j].ff.ff){ sgtree[i].pb({{(max(v2[j].ff.ff,sgtree[i*2+1][ak].ff.ff)-v2[j].ss+n+1)%(n+1),(min(v2[j].ff.ss,sgtree[i*2+1][ak].ff.ss)-v2[j].ss+n+1)%(n+1)},(v2[j].ss+sgtree[i*2+1][ak].ss)%(n+1)}); ak--; } } sort(sgtree[i].begin(),sgtree[i].end()); } cin>>q; for(ll i=0;i<q;i++){ ans[i]=-1; cin>>a>>b; a--; b--; zap.pb({{pier,sufsz},{a,b}}); if(pier+sufsz!=n) vpom.pb({a,i}); else ans[i]=policz(pier,a,b,0,POT/2-1,1); } while(vpom.size()){ sort(vpom.begin(),vpom.end()); reverse(vpom.begin(),vpom.end()); ll nst=m-1; for(ll i=0;i<POT;i++)sg1[i]=INFL; for(pair<ll,ll> i : vpom){ while(nst>=i.ff){ upd(POT/2-1+kras[nst],nst); nst--; } auto ak=zap[i.ss]; pierwszy[i.ss]=min(ak.ss.ss+1,mn(ak.ff.ff+1,n-ak.ff.ss,1,POT/2,1)); } for(pair<ll,ll> i : vpom){ auto ak=zap[i.ss]; smpref[i.ss]=policzsmpref(ak.ff.ff,ak.ss.ff,pierwszy[i.ss]); } for(pair<ll,ll> i : vpom){ auto ak=zap[i.ss]; smsuf[i.ss]=policzsmsuf(ak.ff.ff,ak.ss.ff,pierwszy[i.ss]); } for(pair<ll,ll> i : vpom){ auto ak=zap[i.ss]; if(n-(gdzier[1+max(-1LL,prefr[max(-1LL,n-zap[i.ss].ff.ss)]-smsuf[i.ss])]+1)+(gdziel[1+max(-1LL,sufl[zap[i.ss].ff.ff]-smpref[i.ss])])>n){ ll pocz=ak.ss.ff; ll kon=pierwszy[i.ss]; while(pocz!=kon){ ll mid=(pocz+kon+1)/2; auto ak=zap[i.ss]; smsuf[i.ss]=policzsmsuf(ak.ff.ff,ak.ss.ff,mid-1); smpref[i.ss]=policzsmpref(ak.ff.ff,ak.ss.ff,mid-1); if(n-(gdzier[1+max(-1LL,prefr[max(-1LL,n-zap[i.ss].ff.ss)]-smsuf[i.ss])]+1)+(gdziel[1+max(-1LL,sufl[zap[i.ss].ff.ff]-smpref[i.ss])])<=n){ pocz=mid; } else kon=mid-1; } pierwszy[i.ss]=pocz-1; auto ak=zap[i.ss]; smsuf[i.ss]=policzsmsuf(ak.ff.ff,ak.ss.ff,pierwszy[i.ss]); smpref[i.ss]=policzsmpref(ak.ff.ff,ak.ss.ff,pierwszy[i.ss]); } zap[i.ss].ff.ff=gdziel[1+max(-1LL,sufl[zap[i.ss].ff.ff]-smpref[i.ss])]; zap[i.ss].ff.ss=n-(gdzier[1+max(-1LL,prefr[max(-1LL,n-zap[i.ss].ff.ss)]-smsuf[i.ss])]+1); if(pierwszy[i.ss]!=ak.ss.ss+1 && pierwszy[i.ss]>=ak.ss.ff){ zap[i.ss].ff=operacja(kras[pierwszy[i.ss]],zap[i.ss].ff.ff,zap[i.ss].ff.ss); } zap[i.ss].ss.ff=pierwszy[i.ss]+1; } vpom.clear(); for(ll i=0;i<q;i++){ if(ans[i]!=-1)continue; if(zap[i].ss.ff>zap[i].ss.ss) { ans[i]=brt(zap[i].ff.ff,zap[i].ff.ss,zap[i].ss.ff,zap[i].ss.ss); continue; } if(zap[i].ff.ff+zap[i].ff.ss==n){ ans[i]=policz(zap[i].ff.ff,zap[i].ss.ff,zap[i].ss.ss,0,POT/2-1,1); } else{ vpom.pb({zap[i].ss.ff,i}); } } } for(ll i=0;i<q;i++)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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...