[ARC158E] All Pair Shortest Paths
还是挺牛逼的一题。但是为什么其他题解都说很板?看来还是我太菜了,见的题太少了。
主要参考 @TeneryTree
首先考虑 CDQ 分治,只考虑处理 [l,mid] 中的到 [mid+1,r] 这些点的路径和。
由于列数 m=2 所以我们考虑设 fi,0/1 为左边的点 (i,0/1) 到 (mid,0) 的最短路距离,右边的点 (i,0/1) 到 (mid+1,0) 的最短路距离。设 gi,0/1 为左边的点 (i,0/1) 到 (mid,1) 的最短路距离,右边的点 (i,0/1) 到 (mid+1,1) 的最短路距离。显然这两玩意每次直接 O(n) 递推即可。
然后考虑一下跨区间的贡献是什么。设贡献为 w 则有:
w=2i=l∑midj=mid+1∑rmin(fi,0/1+fj,0/1,gi,0/1+gj,0/1)
这玩意看着好像不太好直接计算。也不太知道怎么想到的,考虑这样子做:
w=2i=l∑midj=mid+1∑r{min(fi,0/1+fj,0/1−gi,0/1−gj,0/1,0)+gi,0/1+gj,0/1}
然后拎出去!
w=2i=l∑midj=mid+1∑r{min(fi,0/1+fj,0/1−gi,0/1−gj,0/1,0)}+4i=l∑midgi,0/1⋅(r−mid)+4i=mid+1∑rgi,0/1⋅(mid−l+1)
现在这个式子好看多了qwq。后面那一整串直接计算即可了。而前面那一串取值也只有两种情况,非常好搞。设前面那一串值为 2w2,一下省略 0/1 这一维。设 pi=fi−gi 则有:
w2=i=l∑midj=mid+1∑rmin(pi+pj,0)
=i=l∑midj=mid+1∑r(pi+pj)[pi>−pj]
这玩意相当好弄,只需要排序二分一下做完了。
总的复杂度 O(nlog2n)
code