Loading

Range Pair Distance Query

洛谷6778

给定一棵 \(n\) 个点的树,边带权(\(<2^{32}\)),\(n\) 次查询 \(\sum_{l\le i<j\le r}dis(i,j)\)。其中 \(dis(i,j)\) 代表点 \(i\)\(j\) 的距离。

我不会归约,但是这个问题似乎只有根号做法。

序列分块

设定一个阈值 \(B\),将序列每 \(B\) 个一块,总共分成 \(\frac{n}{B}\)。对于每个块,预处理出每个点到块内的点的距离和,这可以使用树形动态规划算法。并预处理出第 \(i\) 个块到第 \(j\) 个块的答案。这样就求出了整块之间和散块与整块的贡献。剩下散块之间的贡献,可以先建虚树再跑树形动态规划。分析一下算法复杂度。预处理部分是 \(O(\frac{n^2}{B})\) 的,查询部分是 \(O(nB)\) 的。通过均值不等式可以算出最优复杂度在 \(B=\sqrt{n}\) 时取到 \(O(n\sqrt{n})\)。根据是否离线确定空间复杂度是 \(O(n\sqrt{n})\) 还是 \(O(n)\)

常数是程序不可忽略的部分,所以一些实现上的细节可能会有很大的影响。

莫队

posted @ 2023-05-12 21:28  Semsue  阅读(34)  评论(0编辑  收藏  举报
Title