Codeforces 1862G 题解

发布时间 2023-10-24 16:10:45作者: CTHOOH

传送门

题解

因为有这个操作:将序列 \(a\) 加上 \(\{n, n - 1, \cdots, 1\}\),考虑差分。

那么显然每次操作会将差分数组中的每个元素减去 \(1\),如果差分数组中有 \(0\),就会把 \(0\) 删除。

所以可以发现差分数组中剩下的一定是操作前的最大值。

由于操作后最大值还是最大值,最小值仍然是最小值,所以答案是 原序列最大值+差分数组最大值。

考虑用 multiset 维护原序列和差分,当有一次修改操作(将 \(x \to y\)),我们更新 multiset

  1. 求出 \(x\) 在原序列中的前驱与后继。
  2. 在维护差分数组的 multiset 中删除 \(x\) 与前驱的差和 \(x\) 与后继的差。
  3. 在原序列的 multiset 中插入 \(y\)
  4. 加入 \(y\) 与它前驱的差与 \(y\) 与它后继的差。

然后就没了。

code: