「突刺贯穿的第二分块」。
和隔壁第一分块差不多吧(
对于一个块,设最大值为 k,进行参数为 x 的修改操作。
若 k≤2x,则只需要将值域区间 (x,k] 合并到 [1,k−x] 上,那么此时操作完后 k 至少减小 k−x,并且需要合并的数值也是 O(k−x) 种的。
若 k>2x,则只需要将值域区间 [1,x] 合并到 [x,2x] 上,再打上区间减 x 的标记,那么此时操作完后 k 至少减小 x,并且需要合并的数值也是 O(x) 种的。
也即,每次操作后 k 是不增的,并且需要合并的数值也是减少的值级别的。
也就是最终要合并的数值的种类总共是值域级别的。
那么如何 O(1) 合并两个值?
并查集即可,同时简单地维护一下每个块内每个值的个数。
代码:
1 |
|