根据套路进行分治。
把最大的边切开,变成(l,md),(md+1,r),处理过中线的询问,接着继续递归。
处理的方法是对于每一个节点跑最短路,用中线(s->md)+(md->t)更新答案。
这样子一次询问时间复杂度是中线长度。由于每次选择较长的边切开,所以询问的时间复杂度不会超过sqrt(n*m)。
网上neither_nor的证明是错的。因为长边/2以后不一定会变为短边。
这道题要用主定理证明时间复杂度。
设x为短边长度,y为长边长度,则x^2*y*log(xy)就为每次最短路时间复杂度。
由于x<=y,所以x<=sqrt(n)
x^2*y*log(xy)<=ssqrt(s)*log(xy)
递归式是$O(s)=2O(frac{s}{2})+ssqrt{s}log_2(s)$
直接套用主定理。在此题中a=b=2,log_b a=1
由于f(s)>=Ω(s^{1.5})
所以时间复杂度就是$O(s sqrt{s}log_2s)$