data structure keys #1

发布于 2019-09-09  916 次阅读


已知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).


WRYYYYYYYYY!