hdu5306 Gorgeous Sequence(线段树)

这篇博客介绍了如何使用线段树解决HDU5306问题,重点在于处理数组更新操作并维护线段树中最大值、次大值和最大值数量。文章通过分析三种更新情况,说明了在特定情况下线段树暴力递归更新的时间复杂度仍然是线性的。
摘要由CSDN通过智能技术生成

题意:

给你一个数组a长度为n,有三种操作:

  • 0 x y t:a_i=min(a_i,t),x<=i<=y.
  • 1 x y:求max(a_x,a_{x+1}...a_{y-1},a_y).
  • 2 x,y:求\sum_{i=x}^{y}a_i.

刚刚结束的字节跳动camp出了一道取最小值的差不多的题,当时不会,现在来补一下。

  1. 对于一棵线段树我们存一下每个节点管辖区域的最大值mx,次大值se还有最大值的数量cnt。
  2. 每次更新的时候,会有三种情况
    1. t>=mx,管辖区域内全部值不会受本次更新影响;
    2. mx>t>se,管辖区域内只有mx值受到本次更新影响,我们只要把mx更新到t,sum减去mx和t的差值乘上cnt即可;
    3. se>=t,管辖区域内有若干个值受到本次更新影响,那么我们直接暴力递归更新;
    4. 重复以上操作。
  3. 然后操作1和操作2,就是一颗线段树的普通用法了。

接下来,口胡证明一下为什么对于情况三我们暴力更新的时间复杂度是正确

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值