不要老往数学上想
第一反应是 $O(n^2)$ 40分的做法(很显然),直接 $O(n\sqrt{n})$ 把每个数分解,建图连边,再从大到小扫描每个因数,由此处理出所有 $gcd(a, b)$ ,这里是 $O(n^2)$ ,然后暴力枚举 $i : 1 \rightarrow m$ ,并查集维护即可,这里是 $O(n\log n)$
但满数据 $n \le 10^5$ 肯定不允许 $n^2$ ,空间时间都挂了
仔细看,上面的瓶颈主要在求 $gcd(a, b)$ 只要我们要求出所有 $gcd$ ,就一定会有一个 $n^2$ 的时空复杂度,这显然应该放弃,那么考虑题目可否不求或者不求出全部的 $gcd$
发现题目的问题有一下性质:
- 这 $n$ 个数是 $1 \sim n$ 连续的(我以为很有用,然并卵)
- 只是询问图的联通性,不询问具体的两个数的 $gcd$
- 答案求的是一个最值
- 图建好后,询问不会再改变图了
除开第一个误导我好久的性质,我们来看看其它性质如何使用:
首先最好用的是性质3,它明显提示我们建一个有权值的图,将询问转化为求权值,具体的,可以建一棵有边权的树,权值对应的时间,两个点之间的路径上的最大边权就是答案
现在主要问题在建图了,再看现性质2,明显我们不必也不能求 $gcd$ 来建图,正难则反,考虑可否枚举倍数,发现在只关注图的联通性的情况下,每天连出的边等效于从第 $m - i + 1$ 号城向它的所有倍数号城连边,边权就是天数,正确性显然,而这样建图,时间复杂度为 $O(\frac{n}{1} + \frac{n}{2} + … + \frac{n}{n}) = O(n)$ ,但我们要的是树,毕竟如果有多条路径就不好处理了,于是用类似最小生成树的思想,取最小的边权(其实就是天数最小)加入树中,用并查集维护联通性,一共是 $O(n \log n)$
现在树建好了,性质2、3也都用了,来考虑询问,上面说过,两个点之间的路径上的最大边权就是答案,但每次暴力求权值肯定不行,结合 $n \le 10^5$ 和所求问题,不难想到树链剖分,如果是树剖,当然,本题得以解决
但是考虑性质4,树剖是支持修改和区间操作的,用在本题这静态的图上不免大材小用(主要是调不出来),于是思考,可否用一个预处理后在 $O(\log n)$ 内回答询问
当然是可以的,考虑树上倍增,用ST表+lca即可
1 |
|