[UOJ164] 【清华集训2015】V(线段树)

题意

  • 给你一个序列,支持区间加上一个数,区间减去一个数,区间赋值,单点查询,单点历史最大值查询。

首先发现三种操作可以转化为同样的形式,定义 ( x , y ) (x,y) (x,y)为区间加上 x x x后与 y y y取max的标记,那么区间加就是 ( x , 0 ) (x, 0) (x,0),区间减就是 ( − x , 0 ) (-x, 0) (x,0),区间赋值就是 ( − i n f , x ) (-inf,x) (inf,x),这个标记合并也比较方便,在 ( a , b ) (a,b) (a,b)标记后加上 ( c , d ) (c,d) (c,d)这个标记就变成了 ( a + c , m a x ( b + c , d ) ) (a+c,max(b+c,d)) (a+c,max(b+c,d))

这样子我们就能很方便实现单点查询了,但是单点历史最大值查询似乎不太好做,我们对于每个点维护一个历史最大值标记,分别表示作用在这上面的所有标记中的两维分别的历史最大值,意思就是两维并不需要在同一个时候打上这个标记,下放的时候把父亲的历史最大值标记直接给儿子就好了,因为在下放前的所有影响了父亲的标记一定会影响儿子,并且这些标记是在儿子标记确定好之后发生的,所以可以直接把历史最大值标记合并到儿子的当前标记上,复杂度 O ( n log n ) O(\text{n log n})

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值