UOJ164 V 线段树历史查询

题目:

第一行两个数:n,m。

接下来一行 n 个数,第 i个数表示初始时第i个水箱内有ai m3的水。

接下来 m 行中,第 i行第一个数ti表示操作类型:

若 ti=1,则接下来三个整数li,ri,xi,表示打开编号在[li,ri]中的所有水箱的上方接口xixi 秒。

若 ti=2,则接下来三个整数li,ri,xi,表示打开编号在[li,ri]中的所有水箱的下方接口xixi 秒。

若 ti=3,则接下来三个整数li,ri,xi,表示将编号在[li,ri]中的所有水箱与大海连接,使这些水箱中都恰有xi m3的水。

若 ti=4,则接下来一个整数yi,表示测量在第yi 个水箱的上下方接口处接上一个电动势为 1 V   的电源时通过电源的电流。

若 ti=5,则接下来一个整数yi,表示测量此时在第yi 个水箱中的水渍高度。
思路:

各用一个二元组保存现在和历史的最大值,其中(x,y)代表加上x后对y取最大值,下传标记时将标记加起来即可:

(x, y) + (u, v) = (x + u, max(y + u, v))

注意(x,y)是老标记,(u,v)是下传的标记(开始重载了运算符又没注意顺序,搞反了调了好久……)

考虑加法操作就是将(x, -INF)下传,区间修改就是将(-INF, x)下传。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>

#define For(i,j,k) for(int i = j;i <= k;i++)
#define Forr(i,j,k) for(int i = j;i >= k;i--)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值