Submission #1300053

#TimeUsernameProblemLanguageResultExecution timeMemory
1300053FaggiWall (IOI14_wall)C++20
100 / 100
2033 ms206956 KiB
#include <bits/stdc++.h> #define ll int #define sz(x) int(x.size()) #define all(x) x.begin(),x.end() #define pb push_back #define fr first #define se second #define mp make_pair using namespace std; struct nodo { ll sum=0; ll mi[2]={0,0}, cmi[2]={0,0}, ma[2]={0,0}, cma[2]={0,0}; }; vector<ll>I, D; vector<nodo>seg; ll pot=1; void updMa(ll nod, ll x) { if(seg[nod].mi[0]==seg[nod].mi[1]) seg[nod].mi[1]=x; seg[nod].sum-=seg[nod].cmi[0]*seg[nod].mi[0]; seg[nod].mi[0]=x; seg[nod].sum+=seg[nod].cmi[0]*x; for(ll i=0; i<2; i++) if(seg[nod].ma[i]<x) seg[nod].ma[i]=x; } void updMi(ll nod, ll x) { if(seg[nod].ma[0]==seg[nod].ma[1]) seg[nod].ma[1]=x; seg[nod].sum-=seg[nod].cma[0]*seg[nod].ma[0]; seg[nod].ma[0]=x; seg[nod].sum+=seg[nod].cma[0]*x; for(ll i=0; i<2; i++) if(seg[nod].mi[i]>x) seg[nod].mi[i]=x; } void prop(ll nod) { for(ll i=0; i<2; i++) if(seg[nod*2+i].mi[0]<seg[nod].mi[0]) updMa(nod*2+i,seg[nod].mi[0]); for(ll i=0; i<2; i++) if(seg[nod*2+i].ma[0]>seg[nod].ma[0]) updMi(nod*2+i,seg[nod].ma[0]); } ll INF=INT_MAX; void act(ll nod) { ll i, j; seg[nod].mi[0]=seg[nod].mi[1]=INF; seg[nod].ma[0]=seg[nod].ma[1]=0; for(i=0; i<2; i++) for(j=0; j<2; j++) { if(seg[nod*2+i].mi[j]<seg[nod].mi[0]) { seg[nod].mi[1]=seg[nod].mi[0]; seg[nod].mi[0]=seg[nod*2+i].mi[j]; } else if(seg[nod*2+i].mi[j]<seg[nod].mi[1]) seg[nod].mi[1]=seg[nod*2+i].mi[j]; if(seg[nod*2+i].ma[j]>seg[nod].ma[0]) { seg[nod].ma[1]=seg[nod].ma[0]; seg[nod].ma[0]=seg[nod*2+i].ma[j]; } else if(seg[nod*2+i].ma[j]>seg[nod].ma[1]) seg[nod].ma[1]=seg[nod*2+i].ma[j]; } seg[nod].cmi[0]=seg[nod].cmi[1]=seg[nod].cma[0]=seg[nod].cma[1]=0; seg[nod].sum=seg[nod*2].sum+seg[nod*2+1].sum; for(i=0; i<2; i++) { for(j=0; j<2; j++) { if(seg[nod].mi[0]==seg[nod*2+i].mi[j]) seg[nod].cmi[0]+=seg[nod*2+i].cmi[j]; if(seg[nod].mi[0]!=seg[nod].mi[1]&&seg[nod].mi[1]==seg[nod*2+i].mi[j]) seg[nod].cmi[1]+=seg[nod*2+i].cmi[j]; if(seg[nod].ma[0]==seg[nod*2+i].ma[j]) seg[nod].cma[0]+=seg[nod*2+i].cma[j]; if(seg[nod].ma[0]!=seg[nod].ma[1]&&seg[nod].ma[1]==seg[nod*2+i].ma[j]) seg[nod].cma[0]+=seg[nod*2+i].cma[j]; } } } void chmax(ll a, ll b, ll x, ll nod) { if(I[nod]>b||D[nod]<a) return; if(I[nod]>=a&&D[nod]<=b) { if(seg[nod].mi[0]>=x) return; if(seg[nod].mi[1]>x||seg[nod].mi[1]==seg[nod].mi[0]) { updMa(nod,x); return; } } prop(nod); chmax(a,b,x,nod*2); chmax(a,b,x,nod*2+1); act(nod); } void chmin(ll a, ll b, ll x, ll nod) { if(I[nod]>b||D[nod]<a) return; if(I[nod]>=a&&D[nod]<=b) { if(seg[nod].ma[0]<=x) return; if(seg[nod].ma[1]<x||seg[nod].ma[0]==seg[nod].ma[1]) { updMi(nod,x); return; } } prop(nod); chmin(a,b,x,nod*2); chmin(a,b,x,nod*2+1); act(nod); } ll calc(ll a, ll b, ll nod) { if(I[nod]>b||D[nod]<a) return 0; if(I[nod]>=a&&D[nod]<=b) return seg[nod].sum; prop(nod); ll res=calc(a,b,nod*2)+calc(a,b,nod*2+1); act(nod); return res; } void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]) { ll i=0; while(pot<n) pot*=2; seg.resize(pot*2); I.resize(pot*2); D.resize(pot*2); for(i=0; i<n; i++) seg[i+pot].cmi[0]=seg[i+pot].cma[0]=1; for(i=pot; i<pot*2; i++) I[i]=D[i]=i; for(i=pot-1; i>0; i--) { I[i]=I[i*2]; D[i]=D[i*2+1]; seg[i].cmi[0]=seg[i*2].cmi[0]+seg[i*2+1].cmi[0]; seg[i].cma[0]=seg[i*2].cma[0]+seg[i*2+1].cma[0]; } for(i=0; i<k; i++) { if(op[i]==1) chmax(left[i]+pot,right[i]+pot,height[i],1); else chmin(left[i]+pot,right[i]+pot,height[i],1); } for(i=0; i<n; i++) finalHeight[i]=int(calc(i+pot,i+pot,1)); return; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...