题解 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)\)。