제출 #1035781

#제출 시각아이디문제언어결과실행 시간메모리
1035781amirhoseinfar1385모임들 (IOI18_meetings)C++17
0 / 100
255 ms307528 KiB
#include "meetings.h" #include<bits/stdc++.h> using namespace std; const long long maxn=100000+10,lg=20,kaf=(1<<lg),maxr=1e6+5; long long ezaf=0,all[maxn],n,dpl[maxn],dpr[maxn],tr[maxn],tl[maxn],psl[maxn],psr[maxn],inf=1e16; vector<pair<int,int>>allql[maxn],allqr[maxn]; long long q,res[maxn]; struct func{ long long x0,y0,sh,ta,wa; func(){ x0=0; y0=inf; sh=0; ta=inf; wa=inf; } long long get(long long x){ if(x>=ta){ return wa; } return (x-x0)*sh+y0; } }fakefunc; struct lichao{ struct node{ func f; int cl,cr; node(){ cl=cr=-1; } }fakenode; vector<node>alln; int te=1; lichao(){ te=1; alln.resize(1); } void clear(){ for(int i=0;i<te;i++){ alln[i]=fakenode; } te=1; } long long getl(long long i){ if(alln[i].cl==-1){ if((int)alln.size()==te){ alln.push_back(fakenode); } alln[i].cl=te; te++; } return alln[i].cl; } long long getr(long long i){ if(alln[i].cr==-1){ if((int)alln.size()==te){ alln.push_back(fakenode); } alln[i].cr=te; te++; } return alln[i].cr; } long long pors(long long i,long long l,long long r,long long x){ if(i==-1){ return inf; } long long ret=alln[i].f.get(x); long long mid=(l+r)>>1; if(r==l+1){ return ret; } if(x<mid){ ret=min(ret,pors(alln[i].cl,l,mid,x)); }else{ ret=min(ret,pors(alln[i].cr,mid,r,x)); } return ret; } void ins(long long i,long long l,long long r,func fa){ if(alln[i].f.sh==0){ swap(alln[i].f,fa); return ; } if(alln[i].f.get(l)>fa.get(l)){ swap(alln[i].f,fa); } if(r==l+1){ return ; } long long mid=(l+r)>>1; if(alln[i].f.get(mid)<=fa.get(mid)){ return ins(getr(i),mid,r,fa); }else{ swap(alln[i].f,fa); return ins(getl(i),l,mid,fa); } } }lch; struct segment{ lichao seg[(1<<(lg+1))]; void clear(){ for(int i=0;i<(1<<(lg+1));i++){ seg[i].clear(); } } void ins(long long i,func f){ i+=kaf; while(i>0){ seg[i].ins(0,0,maxr,f); i>>=1; } } long long pors(long long i,long long l,long long r,long long tl,long long tr,long long x){ if(l>r||l>tr||r<tl||tl>tr){ return inf; } if(l>=tl&&r<=tr){ return seg[i].pors(0,0,maxr,x); } long long m=(l+r)>>1; return min(pors((i<<1),l,m,tl,tr,x),pors((i<<1)^1,m+1,r,tl,tr,x)); } }seg; void caltltr(){ vector<long long>v; all[0]=inf; all[n+1]=inf; v.push_back(0); for(long long i=1;i<=n+1;i++){ while(v.back()!=0&&all[v.back()]<all[i]){ tr[v.back()]=i; v.pop_back(); } // tl[i]=v.back(); v.push_back(i); } v.clear(); v.push_back(n+1); for(long long i=n;i>=0;i--){ while(v.back()!=n+1&&all[v.back()]<all[i]){ tl[v.back()]=i; v.pop_back(); } // tr[i]=v.back(); v.push_back(i); } } void solvel(){ vector<long long>v; v.push_back(0); for(long long i=1;i<=n;i++){ dpl[i]=inf; while(all[v.back()]<all[i]){ dpl[i]=min(dpl[i],dpl[v.back()]+(i-v.back()-1)*all[v.back()]); v.pop_back(); } v.push_back(i); if(tl[i]==i-1){ dpl[i]=psl[i]=psl[tl[i]]+all[i]; }else{ dpl[i]+=all[i]; } psl[i]=psl[tl[i]]+(i-tl[i])*all[i]; func fa; fa.x0=i; fa.y0=dpl[i]; fa.sh=all[i]; fa.ta=tr[i]; fa.wa=inf-tr[i]; seg.ins(v.size()-1,fa); for(auto x:allqr[i]){ long long p=lower_bound(v.begin(),v.end(),x.first)-v.begin(); long long now=i; now=v[p]; long long manf=psl[tl[now]]+(x.first-1-tl[now])*all[now]; res[x.second]=min(res[x.second],seg.pors(1,0,kaf-1,p+1,(long long)v.size()-1,i)-manf); } } } void solver(){ vector<long long>v; deque<int>tofv; seg.clear(); v.push_back(n+1); tofv.push_front(n+1); for(long long i=n;i>=1;i--){ dpr[i]=inf; while(all[v.back()]<all[i]){ dpr[i]=min(dpr[i],dpr[v.back()]+(v.back()-i-1)*all[v.back()]); v.pop_back(); tofv.pop_front(); } tofv.push_front(i); v.push_back(i); if(tr[i]==i+1){ dpr[i]=psr[i]=psr[tr[i]]+all[i]; }else{ dpr[i]+=all[i]; } psr[i]=psr[tr[i]]+(tr[i]-i)*all[i]; func fa; fa.x0=i; fa.y0=dpl[i]; fa.sh=-all[i]; seg.ins(v.size()-1,fa); for(auto x:allql[i]){ int p=lower_bound(tofv.begin(),tofv.end(),x.first+1)-tofv.begin(); long long now=i; if(p==0||p-1>=(int)tofv.size()){ return ; } now=tofv[p-1]; long long manf=psr[tr[now]]+(tr[now]-x.first-1)*all[now]; now=i; while(tr[now]<=x.first){ res[x.second]=min(res[x.second],dpr[now]+(now-i)*all[now]-manf); now=tr[now]; } } } } std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) { n=H.size(); for(long long i=1;i<=n;i++){ all[i]=H[i-1]; } q=(long long)L.size(); for(long long i=0;i<q;i++){ L[i]++; R[i]++; res[i]=inf; allql[L[i]].push_back(make_pair(R[i],i)); allqr[R[i]].push_back(make_pair(L[i],i)); } caltltr(); solvel(); solver(); vector<long long>ret; for(long long i=0;i<q;i++){ if(L[i]==R[i]){ res[i]=all[L[i]]; } ret.push_back(res[i]); } return ret; }
#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...