CF GYM 102354 B Yet Another Convolution【莫比乌斯反演,整体二分】

题目描述:给出 \(a_i,b_i\) 两个长为 \(n\) 的序列,求 \(c_k=\max\limits_{\gcd(i,j)=k}|a_i-b_j|\)

数据范围:\(n\le 10^5,a_i,b_i\le 10^9\).


首先我们考虑如何求 \(c_1\),我们可以先求 \(c_1=\max\{a_i-b_j|i\bot j\}\)(另一种情况可以将 \(a,b\) 都取反得到),然后将 \(b\) 取反得到

\[c_1=\max_{i=1}^n(a_i+\max_{\gcd(i,j)=1}b_j) \]

这个 \(\gcd\) 我们想用 \(\mu\) 来处理,但是 \(\max\) 不具有可减性,所以我们可以先对每个 \(a_i\),二分出最大可能的 \(b_j\)

\[\begin{aligned}\max_{\gcd(i,j)=1}b_j&>mid \\\sum_{j=1}^n[b_j>mid]\sum_{d|i,j}\mu(d)&>0 \\\sum_{d|i}\mu(d)\sum_{d|j}[b_j>mid]&>0\end{aligned} \]

由于 \(\sum_{d|j}[b_j>mid]\)\(i\) 无关,所以我们考虑使用整体二分。设 \(sum_d=\sum_{d|j}[b_j>mid]\),这个可以通过将 \(b_j\) 离散化之后通过类似莫队的移动指针 \(mid\) 的形式来做。二分 check 的时候就暴力枚举 \(d,i\) 计算。

有一个结论,就是如果一个指针随着分治区间 \([l,r]\) 移动,那么它的总移动次数就是 \(O(n\log n)\) 的,因为在分治的每一层都从左到右移动一轮,一共 \(\log n\) 层。

计算其他的 \(c\) 是类似的,计算 \(c_k\) 只需只将下标被 \(k\) 整除的 \(a_i,b_i\) 留下即可。

时间复杂度

\[O(\sum_{d=1}^n\frac ni\log\frac nid(\frac ni))\approx O(n\log^3n) \]

但是反正是 \(O(能过)\),就不管那么多了。

code

猜你喜欢

转载自www.cnblogs.com/AThousandMoons/p/12678017.html