题意:维护一个数列,三个操作:
1、区间对一个数取min
2、询问区间max
3、询问区间sum
这道题看着就是一个线段树。
仔细观察发现,1操作似乎不是很好维护,如果要维护似乎只能暴力下传。(其实暴力下传也能够过)
有什么更好的办法?
参考吉如一2016集训队论文,发现虽然不能有更好的替代方法,但是可以进行优化,减少下传次数。
维护最大值$max$与区间和$sum$之外,再维护次大值$second$,最大值出现次数$times$。
每次区间对一个数$x$取min时:
若区间$max <= x$,忽略。
区间$max > x$ 但 $second < x$,则$sum$减去$(max - x) \times times$,$max$变为$times$。
$second >= x$,没办法,暴力递归解决。
但是这样好像会递归到不存在的区间呀怎么办?没关系。不存在的区间max与second均为0,到了就会返回回来。唯一带来的坑点就是数组要看到$maxn \times 8$!!!!!(神坑)