吉司机线段树学习笔记
前言
所谓吉司机线段树,最核心的一点是要求你支持这样一个操作:
- 对所有的 \(i\in[l,r]\) 执行 \(a_i\leftarrow \min\{a_i,v\}\)。
这是最基础的一种操作,在此基础上我们可以增加如下操作:
- 区间覆盖、区间加。
- 区间历史版本和、历史版本最值。
下面我们逐步深入来进行讲解。
区间取最值
即核心操作。
我们发现区间取最值这个东西很难维护,因为区间里的数参差不齐,有的可能能被更改,有的则不行。
对此,我们维护区间最大值 \(mx\),区间最大值的个数 \(cnt\) 和区间次大值 \(se\),执行如下策略:
- 若 \(v\geq mx\),则说明没有数会被更新。
- 若 \(se<v\leq mx\),则说明只有最大值会被更新。
- 若 \(v\leq se\),则往下递归暴力修改。
这个算法的时间复杂度是 \(O(n\log n)\) 的,下面说明一下原因:
\(\Phi\)

浙公网安备 33010602011771号