跳转至

区间最值操作 & 区间历史最值

本文讲解吉老师在 2016 年国家集训队论文 中提到的线段树处理历史区间最值的问题。

区间最值

笼统地说,区间最值操作指,将区间 \([l,r]\) 的数全部对 \(x\)\(\max\)\(\min\),即 \(a_i=\max(a_i,x)\) 或者 \(a_i=\min(a_i,x)\)

HDU5306 Gorgeous Sequence

维护一个序列 \(a\),执行以下操作:

  1. 0 l r t \(\forall l\le i\le r,~ a_i=\min(a_i,t)\)
  2. 1 l r 输出 \(\max\limits_{i=l}^r a_i\)
  3. 2 l r 输出 \(\sum\limits_{i=l}^r a_i\)

多组测试数据,保证 \(T\le 100,~\sum n,\sum m\le 10^6\)

区间取 \(\min\),意味着只对那些大于 \(t\) 的数有更改。因此这个操作的对象不再是整个区间,而是「这个区间中大于 \(t\) 的数」。于是我们可以有这样的思路:每个结点维护该区间的最大值 \(Max\)、次大值 \(Se\)、区间和 \(Sum\) 以及最大值的个数 \(Cnt\)。接下来我们考虑区间对 \(t\)\(\min\) 的操作。

  1. 如果 \(Max\le t\),显然这个 \(t\) 是没有意义的,直接返回;
  2. 如果 $Se