【luogu1315】 观光公交[贪心]
noip2011 观光公交
有点难受QAQ
每次修改一条路\(i\) 它只会影响到达景点\(i+1\)以及它之后的连续的会出现”人等车“的情况的景点 若景点\(i+1\)之后出现一个景点是\(x\)"车等人"的情况那么这条路权值减少就会不影响到景点\(x\)及其之后的景点
那么每次贪心减去影响最大的那条边
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
rd(n),rd(m),rd(k);
for(int i=1;i<n;++i) rd(d[i]);
for(int i=1;i<=m;++i){
rd(t[i]),rd(fr[i]),rd(to[i]);
las[fr[i]]=Max(las[fr[i]],t[i]),++dw[to[i]];
}
for(int i=1;i<=n;++i) sum[i]=sum[i-1]+dw[i];
for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
for(int i=1;i<=m;++i) ans+=((ll)lef[to[i]-1]+d[to[i]-1])-t[i];
while(k--){
for(int i=1,nw=0;i<=n;++i) lef[i]=nw=Max(las[i],nw),nw+=d[i];
eff[n-1]=n;//第i条边改变 会影响到的最远城市
for(int i=n-2,arr;i;--i){
arr=lef[i]+d[i];
if(arr>las[i+1]) eff[i]=eff[i+1];
else eff[i]=i+1;
}
int mx=0,pos=0;
for(int i=1;i<n;++i)
if(d[i]&&sum[eff[i]]-sum[i]>mx) mx=sum[eff[i]]-sum[i],pos=i;
ans-=mx,--d[pos];
}
printf("%lld",ans);
return 0;
}