「杂谈」原来我不会线段树懒标记以及永久化

「杂谈」原来我不会线段树懒标记以及永久化

原来我不会线段树懒标记以及永久化。

虽然很多时候用线段树只是什么区间加区间和,区间加区间最值,区间推平区间求和等等,大部分都是不知背后的所以然就瞎打标记就 ok 了,没想到背后还有道理要探寻,免得最后自己跳进了坑里才发现是线段树/树套树没写对。


如果是正常打懒标记,是需要这个标记在时间轴上有结合律的,可以不满足交换律。

回想线段树懒标记下放的过程就可以感性理解是为什么,因为在打标记的时候我们把标记 t3 下放了,后来的标记 t3 一定在前面的标记 t2 后面,所以不需要满足结合律,然而下放标记 t2 的时候可能和前面的标记 t1 合并,但 t1 还没有和更前面的标记 t0 合并,如果 (t2t1)t0t2(t1t0) 就 GG 了,这里的 ab 就是把两个标记 a,b 合并,前面的 a 合并到了 b 上面,是我瞎定义的符号,是为了突出这个运算是有先后顺序的。

比方说加法乘法标记我们维护了一个 ax+b,如果两个标记 t0=(a0,b0),t1=(a1,b1) 把他们合并,最终的标记就是 t1t0=(a0a1,b0a1+b1),假设有三个先后出现的标记 t0,t1,t2,我们发现 (t2t1)t0=t2(t1tot0)。这个就是标记在时间轴上具有结合律,但它没有交换律,t1t0=(a0a1,b0a1+b1),t0t1=(a1a0,b1a0+b0),这两个标记是不同的。


回想起标记永久化的过程,需要标记在时间轴上具有结合律,是不是必须要求标记在时间轴上有交换律呢?

其实是不必要的,只需要对于两个标记 ab,如果能找到一个 a 使得 ab=ba,在一个标记 a 在线段树上往下走的时候,如果当前节点有个标记 b,让 a 变成 a 就可以,因为标记永久化查询的时候不会 pushdown,所以运算顺序交换了一下,但原先是 ab,不得不把 a 放在 b 后面合并,就把 a 变成 a,使得标记永久化查询到的 baab 是等价的。

树套树的时候记得看一下能不能标记永久化。


线段树题要考虑:

  • 给区间整体打标记的时候,维护的值会发生什么变化;
  • 给区间整体打标记的时候,标记之间如何合并;
  • 是否能快速地 pushup

Reference

zhqwq 我 根 本 不 会 线 段 树|线段树再学习笔记

posted @   do_while_true  阅读(399)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
历史上的今天:
2020-09-28 Luogu P1441 砝码称重

This blog has running: 1845 days 1 hours 33 minutes 57 seconds

点击右上角即可分享
微信分享提示