【21 ZR联赛集训 day18】聚会
【21 ZR联赛集训 day18】聚会
给出一个由小的编号连向大的编号的 DAG,有 \(q\) 次询问,每次给出 \(t\) 和若 \(s\) 个点,表示除这些点之外其他点到 \(t\) 的最大距离。问距离最远的那个结点编号。\(1\le n \le 10^5,1\le m \le 2\times 10^5,\sum s\le 10^5\)。
根号分治。
对每个点求出到它距离最远的点是 \(O(n^2)\) 的。可以按照拓扑序 DP,把 \(u\) 转移到所有它能到达的结点,时间复杂度 \(O(n)\)。
鉴于我们每次询问会失去一些点,我们可以记录下每个点离它前 \(\sqrt{n}\) 远的点,预处理时间和空间都是 \(n\sqrt{n}\),还是 DP 做,合并儿子转移。
对于每次询问,分两种情况:
- \(s>=\sqrt{n}\):
这种情况不超过 \(\sqrt{n}\) 次,因此暴力搜一遍就好,一次 \(O(n)\)。 - \(s<\sqrt{n}\):
直接 \(O(\sqrt{n})\) 扫一遍记录的数组即可。
总时间复杂度和空间复杂度是 \(O(n\sqrt{n})\)。
本文来自博客园,作者:liyixin,转载请注明原文链接:https://www.cnblogs.com/liyixin0514/p/18435579