已知n个点树T,有m条路径覆盖T上的若干边,第i条路径带权wi,,对每条边求覆盖它的所有路径wi最小值。
o(nlog^2n)方法:树链剖分+线段树
o(nlogn)方法:每条路径可以拆成o(logn)条长度为2^k的子路径,对每条2^k子路径向下更新两条2^k-1路径的wi最小值。实际操作时从高到低枚举k,依次枚举每个点,可以做到o(nlogn):
for(k=20;k>0;--k)
for(i=1;i<=n;++i)
{
t=p[i][k-1];
f[i][k-1]=min(f[i][k-1],f[i][k]), f[t][k-1]=min(f[t][k-1],f[i][k]);
}
注意这样计算只能保证长度为1的路径是最小值,可以再k从小往上枚举更新任意长度的路径的最小值,还是o(nlogn).




Comments | NOTHING