6.23 线段树

​P4314 求历史最值

启发

线段树的标记需要满足封闭性,即标记经过操作后形式不变

思路

此题中令二元组 \((x,y)\) 表示当前最值和历史最值

加 \(a\) 后变为 \((x+a,max(y,x+a))\)

赋值 \(b\) 后变为 \((b,max(y,max(x+a,b))\)

可知设立区间加、区间赋值、历史区间加、历史区间赋值四个标记

则形式为 \((x+a,b,max(y,x+c,d))\)

可知加和赋值时的标记变化(注意加时若已赋值就加在赋值标记上)

接下来考虑下传

1.加在赋值前(因为赋值后的加加在了赋值标记上)

2.加法标记下传:

令父亲为 \((x+a,b,max(y,x+c,d))\),儿子为 \((x+a',b',max(y,x+c',d'))\)

则 \((x+a',b',max(y,x+c',d'))\rArr(x+a'+a,b'+a,max(y,x+max(c',a'+d),max(d',b'+d))\)

3.赋值标记下传:

\[(x+a',b,max(y,x+c',d)) \]

可得标记变化

​P1502

​思路1

启发

涉及到矩形覆盖,可以考虑使用扫描线

思路二

  1. 构造线段树使得 \(tr_p\) 维护的是 \(p-h \backsim p\) 的区间和。那么对于点 \(a\),它会对 \(a \backsim a+h\) 有贡献

那么我们就将复杂的区间和求最值转化为了区间最值

  1. 至于横向,直接维护一个滑动窗口即可
posted @ 2026-10-30 14:53  Rainesxiao  阅读(3)  评论(0)    收藏  举报