CF1654E Arithmetic Operations 题解

CF1654E

  • 给定一个长度为 \(n\) 的序列 \(a\)
  • 问至少需要修改几个数才能使得 \(a\) 变为一个等差数列。
  • \(n\leq 10^5\)\(1\leq a_i\leq 10^5\)
  • 我们可以发现值域 \(\leq 10^5\) 实属可疑,我们可以就这点进行分析

  • 考虑对于序列的公差 \(d\),如果 \(d\) 太大的话经过若干轮就会超过原数的值域,之后的所有数都一定会被修改

  • 因此我们可以对 \(d\) 进行根号分治

    • \(d \leq \sqrt n\) 时,我们设当前从 \(a_i\) 开始,那么有 \(a_0 = a_i - i \times d\),那我们可以枚举 \(d\)\(i\), 把 \(a_0\) 放到桶中求众数

    • \(d > \sqrt n\) 时,原序列中的数 \(\leq \sqrt n\) 个。我们枚举首项 \(a_i\),则有 \(a_i - i \times d = a_j - j \times d\),移向整理得 \(d = \frac{a_i - a_j}{i - j}\),那么我们就枚举首项 \(a_i\) 和向后枚举 \(\sqrt n\) 个数,求 \(\frac{a_i - a_j}{i-j}\) 的众数即可

  • 最终复杂度 \(O(n \sqrt n)\)

posted @ 2024-08-11 19:05  FOX_konata  阅读(10)  评论(0编辑  收藏  举报