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\)

  1. \(x\leq m\),那 \(r\) 只能在左边选,不用递归右子树了,
  2. \(x>r\) ,往右子树递归,但是加一个 \(r<x\) 的限制。

最后对 \(f\) 进行倍增 , 询问时把区间长度二进制分解然后跳倍增数组,总复杂度 \(O(n\log n)\)

posted @ 2021-04-22 21:43  墨珂  阅读(178)  评论(1)    收藏  举报