貌似是一个论文题,是jls线段树的题目。
首先我们定义一种标记 ((a,b)),表示给这个区间先加上 (a) 再跟 (b) 取 (max),不难发现题目里提到的三种操作分别都可以用这样的标记来代替:
1、区间加(v):((v,−inf))
2、区间减(v):((−v,0))
3、区间覆盖:((−inf,v))
考虑合并两个标记((a,b)),((c,d)),那么就会变成((a+c,max(b+c,d)))。
现在考虑历史标记最大值,对于一个标记,我们可以将它看成是一个分段函数。第一段的函数是(y=b),第二段的函数是(y=x+a)。那么历史最大标记则可以用((max(a,c),max(b,d)))来表示。如下图,红色的部分就是历史标记最大值: