题解 ABC210F

ABC210F - Coprime Solitaire

原题链接

看到这种两面性问题,显然想到 2-SAT。

给每个质数设置一个集合。(\(2\times 10^6\) 之内的质数有 \(148933\) 个)

先把每一个数字都质因数分解,如果某个数有质因数 \(x_1,x_2...\) ,就把这个数的位置、是正反面,加入 \(x_1,x_2\) 对应的集合中。

这样一个集合中的数都不能同时共存,两两连边 \(\neg X\ \or\ \neg Y\)(即若 \(X\)\(\neg Y\))。

但是这样每个集合要连 \(O(n^2)\) 条边,显然爆炸,于是我们想到前后缀优化连边。

对于每个集合,我们令 \(P_i\) 为前缀的 "\(\neg\)" 连边和,\(Q_i\) 为后缀的 ''\(\neg\)'' 连边和。

则对于此集合的第 \(i\) 位,连边 \(i\to P_{i-1},i\to Q_{i+1}\)

这样每个集合只用连 \(O(n)\) 条边了。

总时间复杂度 \(O(n\log L)\)\(L=\max(A_i,B_i)\)

posted @ 2021-07-18 09:11  BlankAo  阅读(279)  评论(3编辑  收藏  举报