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]]);
}
}
``

浙公网安备 33010602011771号