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
启发
涉及到矩形覆盖,可以考虑使用扫描线
思路二
- 构造线段树使得 \(tr_p\) 维护的是 \(p-h \backsim p\) 的区间和。那么对于点 \(a\),它会对 \(a \backsim a+h\) 有贡献
那么我们就将复杂的区间和求最值转化为了区间最值
- 至于横向,直接维护一个滑动窗口即可

浙公网安备 33010602011771号