题意:维护一个序列,4个操作:
1、区间加上x
2、区间赋值为x
3、询问区间最大值
4、询问区间历史最大值
区间历史最值,涉及到多次add和set操作的先后顺序,不是个好办的东西。
参考吉如一2016集训队论文,发现了一个巧妙的做法。
支持add和set操作的线段树有一个性质:
当一次set操作之后,在下一次节点pushdown之前,由于此时区间均为一个数,所以区间add操作可以全部视为区间set。
所以我们只需要考虑第一次set之前的add标记达到过的最值maxadd和后面的set标记达到过的最值maxset。
至此问题已经解决。
程序有点长,在过程中始终要牢记第一次set之后的add全部变成set,不管何处都是一样。
|
|