solution-arc158e

[ARC158E] All Pair Shortest Paths

还是挺牛逼的一题。但是为什么其他题解都说很板?看来还是我太菜了,见的题太少了。

主要参考 @TeneryTree

image

首先考虑 CDQ 分治,只考虑处理 [l,mid][l,mid] 中的到 [mid+1,r][mid+1,r] 这些点的路径和。

由于列数 m=2m=2 所以我们考虑设 fi,0/1f_{i,0/1} 为左边的点 (i,0/1)(i,0/1)(mid,0)(mid,0) 的最短路距离,右边的点 (i,0/1)(i,0/1)(mid+1,0)(mid+1,0) 的最短路距离。设 gi,0/1g_{i,0/1} 为左边的点 (i,0/1)(i,0/1)(mid,1)(mid,1) 的最短路距离,右边的点 (i,0/1)(i,0/1)(mid+1,1)(mid+1,1) 的最短路距离。显然这两玩意每次直接 O(n)O(n) 递推即可。

然后考虑一下跨区间的贡献是什么。设贡献为 ww 则有:

w=2i=lmidj=mid+1rmin(fi,0/1+fj,0/1,gi,0/1+gj,0/1)w = 2\sum\limits_{i=l}\limits^{mid}\sum\limits_{j=mid+1}\limits^{r} \min ( f_{i,0/1} + f_{j,0/1},g_{i,0/1} + g_{j,0/1})

这玩意看着好像不太好直接计算。也不太知道怎么想到的,考虑这样子做:

w=2i=lmidj=mid+1r{min(fi,0/1+fj,0/1gi,0/1gj,0/1,0)+gi,0/1+gj,0/1}w = 2\sum\limits_{i=l}\limits^{mid}\sum\limits_{j=mid+1}\limits^{r} \{ \min ( f_{i,0/1} + f_{j,0/1} - g_{i,0/1}- g_{j,0/1},0) + g_{i,0/1} + g_{j,0/1} \}

然后拎出去!

w=2i=lmidj=mid+1r{min(fi,0/1+fj,0/1gi,0/1gj,0/1,0)}+4i=lmidgi,0/1(rmid)+4i=mid+1rgi,0/1(midl+1)w = 2\sum\limits_{i=l}\limits^{mid}\sum\limits_{j=mid+1}\limits^{r} \{ \min ( f_{i,0/1} + f_{j,0/1} - g_{i,0/1}- g_{j,0/1},0)\} + 4\sum\limits_{i=l}\limits^{mid}g_{i,0/1}\cdot(r-mid) + 4\sum\limits_{i=mid+1}\limits^{r}g_{i,0/1}\cdot(mid-l+1)

现在这个式子好看多了qwq。后面那一整串直接计算即可了。而前面那一串取值也只有两种情况,非常好搞。设前面那一串值为 2w22w_2,一下省略 0/1 这一维。设 pi=figip_i = f_i - g_i 则有:

w2=i=lmidj=mid+1rmin(pi+pj,0)w_2 = \sum\limits_{i=l}\limits^{mid}\sum\limits_{j=mid+1}\limits^{r} \min (p_i+p_j,0)

=i=lmidj=mid+1r(pi+pj)[pi>pj]= \sum\limits_{i=l}\limits^{mid}\sum\limits_{j=mid+1}\limits^{r}(p_i+p_j)[p_i>-p_j]

这玩意相当好弄,只需要排序二分一下做完了。

总的复杂度 O(nlog2n)O(n\log^2n)

code