CF992E 题解
先说暴力。线段树维护 \(a_i - s_{i - 1}\),每次暴力 \(O(n \log n)\) 查找 \(0\) 的位置。
这会超时,考虑加个优化:
- 维护一个区间 max,在查询到的区间的 max 小于 \(0\) 时退出。
- 设 \(p\) 为修改的位置,\(x\) 为修改成的值。在修改时把区间 \([p, p]\) 加 \(x - a_i\),把区间 \([p + 1, n]\) 加 \(a_i - x\) 即可。注意 \(p = n\) 时会越界。
这时你把优化后的代码交上去,发现它过了。为什么?
因为实际上满足条件的位置只有 \(O(\log n)\) 个。若个数大于 \(O(\log n)\),每个满足条件的位置都会翻倍,则满足不了 \(1 \le p_i \le n\) 的值域。故此时查询到的叶子最多只有 \(O(\log n)\) 个,可以通过。

浙公网安备 33010602011771号