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; 
}

相关文章:

  • 2021-06-20
  • 2022-01-01
  • 2021-12-15
  • 2021-07-08
  • 2021-12-15
  • 2021-08-06
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-04
  • 2021-07-27
  • 2022-12-23
  • 2021-11-26
相关资源
相似解决方案