题解:CF2123G Modular Sorting
把模数记作 \(m\)。一次加 \(k\) 操作不会改变元素对 \(d=\gcd(k,m)\) 的余数,因此数组被永久地分进 \(d\) 个同余类。将每个同余类排成一列,其值依次是 \(0,d,2d,\dots ,m-d\)。整张表有 \(d\) 列、\(h=m/d\) 行;列内元素从低到高严格递增,列间互相独立。
从左到右扫描原数组,用贪心策略给每个 \(a_i\) 选尽量低的行:若 \(a_i\bmod d\ge a_{i-1}\bmod d\),放在同一行即可;否则只能放到上一行,此时产生一次换行。
对固定的 \(d\),整个扫描得到换行次数 \(\text{cnt}_d\)。若 \(\text{cnt}_d<h\),仍有行可用,数组可排成非降序;若 \(\text{cnt}_d=h\),列已用完,无论怎样都无法排好顺序。因此一次查询 YES 的条件是 \(\text{cnt}_{\gcd(k,m)}<m/\gcd(k,m)\)。
预先列出 \(m\) 的所有正约数并为每个 \(d\) 保存 \(\text{cnt}_d\)。这里约数个数用算术函数 \(\tau(m)\) 表示,且 \(\tau(m)\le128\)(因为 \(m\le5\times10^{5}\))。初始化时对每个 \(d\) 各扫描一遍数组,复杂度 \(O(n\tau(m))\)。
赋值操作 \(a_p\leftarrow x\) 仅影响相邻两对元素 \((p-1,p)\) 与 \((p,p+1)\)。对每个 \(d\) 只需常数时间把对应的换行计数修正,整次修改 \(O(\tau(m))\)。查询时先求 \(g=\gcd(k,m)\),再检索并比较,亦为 \(O(\tau(m))\)。总时间复杂度 \(O\bigl((n+q)\,\tau(m)\bigr)\)。

浙公网安备 33010602011771号