CodeForces1516D : Cut
感觉我的做法好复杂,但可能思考起来比较自然。
首先 \(a_l\times a_{l+1} \times...\times a_r = lcm\{a_l,a_{l+1},...,a_r\}\) 意味着 \(\{a_l,a_{l+1},...,a_r\}\) 两两互质。
贪心地,考虑对每个左端点 \(l\) 求出最大的右端点 \(r\) 使得这个区间内的数两两互质,设为 \(f\) 。
记 \(P_k\) 为前 \(k\) 个质数组成的集合,考察 \(\prod_{p \in P_k} p>10^5\) ,在 \(k=7\) 时已经成立,这意味着序列 \(a\) 中每个数的不同质因子个数不超过 \(6\) 。
根据互质的定义以及上面的性质,可以从 \(a\) 的质因子这个角度来考虑。
做一遍埃氏筛,求出每个 \(a\) 的质因子集合(实际上是求了 \(2\) 到 \(\max_{a}\))。
记 \(nxt_{i,j}\) 为下标 \(>i\) , \(j\) 的倍数第一次出现的位置, \(to_i\) 表示第一个下标 \(>i\) ,且不与 \(a_i\) 互质的数的位置。
对每个作为任意 \(a\) 的质因子的质数维护一个 \(vector\) 表示其出现位置,求 \(nxt\) 可以在 \(vector\) 内二分。
假设 \(a_i\) 的质因子集合为 \(\{p_1,p_2,...,p_k \}\),\(to_i\) 就是 \(\min_{j=1}^k nxt_{i,j}\) 。
做完这些来考虑如何求 \(f\) 。
固定了左端点 \(l\) , 一个右端点 \(r\) 合法的条件是 \(\min_{i=l}^r to_i>r\) , 现在要最大化 \(r\) ,这个问题可以在线段树上二分:
from _rqy :
假设现在中间是 \(m\),\(l\) ~ \(m\) 的 \(\min\) 是 \(x\),
- \(x\leq m\),那 \(r\) 只能在左边选,不用递归右子树了,
- \(x>r\) ,往右子树递归,但是加一个 \(r<x\) 的限制。
最后对 \(f\) 进行倍增 , 询问时把区间长度二进制分解然后跳倍增数组,总复杂度 \(O(n\log n)\) 。

浙公网安备 33010602011771号