数据结构入门级技巧
实时更新,遇到好玩的数据结构trick都会放到这里
线段树合并对于子树查一类问题的应用:
由于子树查问题的询问之间往往具有信息包含关系,所以我们可以考虑将询问离线下来,通过一次 将所有子树的信息全部求出来,并在途中回答询问。由于线段树合并过程中线段树代表的就是整个子树内的内容,所以类似于子树颜色众数之类的问题也是可以解决的。
区间某数出现次数的实现方式:
虽然主席树可以做到在线 ,空间复杂度 ,但是查询效率、预处理时间、空间没有一项特别拔尖。我们可以考虑用 记录每一个数的所有出现位置,然后查询时直接在对应的 上二分即可,在线 且空间复杂度 。考虑如何更快地回答查询:我们用分块预处理出 ,前 块中 的出现次数。这样对于整块,我们可以直接 查询,而对于散块内部的个数,我们再次在 上二分求出个数,这个算法在线,预处理 ,空间 ,但是时间变成了 ,近似于大常数 。考虑将线段树改为 叉的,也就是分块。此时类似于主席树一样,将每次的修改都记录下来,可以做到 插入 可持久化, 查询,在线 ,空间复杂度为 。
分块对于修改简单,查询复杂题目的应用:
如果修改只是单点修改,但是查询比较非常规,可以考虑对于每一块维护较为复杂的信息,然后单点修改时直接 暴力重构块。
位运算:
维护位运算信息时,如果固定左端点,总共的 等信息的可能种数只有 种( 代表值域)。此时我们就可以暴力二分出所有不同值的区间,进行信息的维护。
其实 也只有 种取值,因为 每次变小一定是除以一个至少为 的正整数。
表的应用:
所有满足可以 ,两个相同信息作用后不变的信息都是可以用 表维护的。例如区间 ,区间按位与,区间按位或,区间 等。
第 小值:
第 小值可以通过一个 的代价二分答案而转化为区间小于 的值的个数,便于维护。
字符串相关题目:
遇到字符串上区间修改区间查询等问题时,可以考虑建字符集个线段树来处理问题,一般会将问题简化很多。而正解绝大多数情况下都是要依赖字符集大小的,不然这道题可以直接搬到序列上。
线段树合并的应用:
线段树合并可以在过程中每一次合并后新开一个节点,这样即使是强制在线也可以直接在查询时在对应位置查询,空间消耗也不是特别大。
树上问题:
当树上问题只涉及对 子树查询的时候,换根是假的,因为新的根如果是 的祖先或者其祖先的其他子树内的点,那么显然子树不变,如果是 那么显然子树是整棵树,如果在 的子树中那么子树就是整棵树刨掉一部分子树,对应在 序上就是两段区间。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类