P3280 题解

P3280

思路

没有求买入了多少,所以可以当作每次把能买的全都买了,走在路上不行再扔。卖出时由题意能卖多少卖多少。

主要的问题是求从城到城最多能带多少东西。计算两点间路径的权值最小值而不在意距离,建最大生成树,把图改作树。通过倍增的方式,求 lca 时算路径权值的最小值。对于火车,可以理解为一条权值为 \(\infty\) 的路。

由于 \(\infty\) 足够大,火车的边一定在最大生成树上。在此基础上建最大生成树。lca 跳公共祖先的同时计算路径上最小权值。

code

	if(b[a[1]]>0)sum=b[a[1]];
	else printf("0\n");
	for(int i=2;i<=n;i++){
		lim=lca(a[i-1],a[i]);
		if(sum>lim)sum=lim;
		if(b[a[i]]>0)sum+=b[a[i]];
		else{
			printf("%lld\n",min(sum,-b[a[i]]));
			sum-=min(sum,-b[a[i]]);
		}
	}
``
posted @ 2024-05-10 20:03  yhddd  阅读(13)  评论(0)    收藏  举报