2018.07.28 uoj#164. 【清华集训2015】V(线段树)

传送门
线段树好题。
要求支持的操作:
1.区间变成 m a x ( x i − a , 0 ) max(x_i-a,0) max(xia,0)
2.区间加
3.区间覆盖
4.询问单点最值
5.询问单点历史最值
注:以下提到的标记都是向下传递的懒标记。
这题直接更新区间最大值貌似不好维护,因此我们需要更换思路,对于每个节点维护一个标记 ( a , b ) (a,b) (a,b),来表示在上一次修改这个区间之后当前区间的所有数都变成 ( x i + a , b ) (x_i+a,b) (xi+a,b),这样的话,第一个操作变成了 ( − a , 0 ) (-a,0) (a,0),第二个操作变成了 ( a , − i n f ) (a,-inf) (a,inf),第三个操作变成了 ( − i n f , a ) (-inf,a) (inf,a)。然后查询的时候只用查询单点的 ( a , b ) (a,b) (a,b),然后输出 ( x i + a , b ) (x_i+a,b) (xi+a,b)的较大值就行了。
然后我们考虑这个标记如何合并,假设现在已经有了一个标记 ( a , b ) (a,b) (a,b),从父亲节点传过来了一个标记 ( c , d ) (c,d) (c,d),那么原本这个点的最大值是 m a x ( x i + a , b ) max(x_i+a,b) max(xi+a,b),现在就变成了 m a x ( m a x ( x i + a , b ) + c , d ) max(max(x_i+a,b)+c,d) max(max(xi+a,b)+c,d)<

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值