非常好的一道练习懒标记的题目(这种题目就叫做多标记题目)
我们先不考虑维护总和,先分别维护两个量,表示号节点所代表区间的点的权值,表示号节点所代表区间的点的距离和,表示号节点权值的懒标记,表示号节点距离增量的懒标记
那么对于和来说就跟一般的维护区间加减一样了,非常简单
对于和来说,节点所代表区间的权值可能不完全一样,这是这道题目最大的难点;如果说我们不考虑维护题目所要求的总和,只是维护一个权值,那么如果所代表区间的所有点的权值都一样,那么就为这个权值,否则的话为;然后这里跟"Atlantis"的维护非常像,我们就只考虑叶子节点,一个叶子节点真正的权值就是从这个叶子节点往根节点走,最后一个所代表的权值
然后我们考虑维护题目所要求的总和
注意这里有两个标记需要下传,无论哪个标记下传(还是说两个都要下传),我们都要保证即将往子节点更新的时候,子节点的所有的量都已经被维护成了除了这次操作的最新的值(就是说比如这次操作是第次操作,我们即将进入某一个节点,那么进入的时候一定要保证的所有的量是第次操作之后的最新的值),并且在下传完之后,要保证子节点的值是包含这次操作的最新的值
那我们来看看这些量是否已经可以达到上述要求
我们先随意假设一个优先级,就假设权值的更新优先于距离的更新吧
假设现在要下传,那么考虑如何变化,显然就是(其中是子节点的距离和,还没有更新的距离和);如果说不下传,那么就没问题(因为就说明第次操作之后的最新的的值就是我们之前使用的那个),如果说要下传,那么现在就要变化,减少,而由于前面下传了,说明这个区间的权值都是一样的,故(此时已经被更新了)
假设现在不下传,如果说也不下传,那么没有问题,因为就相当于没有任何更新,否则的话,应该如何变化呢?此时,由于这个区间的每一个点都要减少,那么每一个点对的贡献就会减少这个点的权值乘以,所以说就会减少。也就是说,我们现在维护的量是不够的,我们还要多维护一个区间权值和(注意不能用区间权值代替,因为点的权值可能不完全相同)
剩下的分析就跟上面差不多了,自己分析一下,然后根据代码对照一下
值得一提的是,这里其实到底是优先级更高还是优先级更高是无所谓的
update 2024.7.29
更简单的方法
所以以后不一定非要直接维护题目给出的信息,也可以先选择进行变换一下再维护
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构