吉司机线段树学习笔记

前言

所谓吉司机线段树,最核心的一点是要求你支持这样一个操作:

  • 对所有的 \(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\)

posted @ 2024-09-20 20:00  Linge_Zzzz  阅读(21)  评论(0)    收藏  举报  来源