【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; 
}
原文地址:https://www.cnblogs.com/lxyyyy/p/11656167.html