树状数组学习笔记
树状数组学习笔记
树状数组的使用场景:可差分且有结合律的运算符,如 ^ + *
树状数组优点:编码简单,常数小,但思维量较大。
板子:
这里着重讲一下拓展内容
1. 权值树状数组
很简单,就是跟前缀和用数值做下标一样的。
2. 时间戳优化
普通的 clear 需要 O(N) 的时间复杂度,那如果有多组询问,那就很麻烦了,因为这里的 N 是 n 的最大值,但如果$\sum n $ 较小,那就可以用时间戳优化(但是常数会稍大一点),其实就是把每一个点记一下当前的版本,每一次 clear 都更新一下版本。
3.二维偏序/三维偏序
二维偏序就是变相的逆序对,也就是两个限制条件 如 li<L,ri<R 这样的条件就可以二维偏序。
二维偏序的主要步骤:先根据第一维排序,在用一个树状数组解决。当然,后一维需要进行离散化。
为什么呢?因为你排序之后的值就相当于逆序对里的下标。
这个其实不算很难理解。代码实现也非常的简单,这里就不放了。
三维偏序呢?
这就需要用cdq分治了 。
cdq分治就是一排序,二归并,三树状的做法。
即先用排序来消除一维影响,再用归并排序做出第二维的影响,在使用一个树状数组来解决即可。
因为你归并排序之后就相当于消除了第二维的影响,那再用一个树状数组就可以实现三维偏序了。
核心代码:
这里建议点和询问分开处理,比较简洁,这里的有无 id 就代表是不是点。
完整代码「USACO24OPEN G」Grass Segments
4.第k值
用一个二分的写法是O(log2n) 的,但是用倍增写就是 O(logn) 的。二分很简单,这里就不放了。
__EOF__

本文作者:火牛
本文链接:https://www.cnblogs.com/hnczy/p/18706011.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/hnczy/p/18706011.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 对象命名为何需要避免'-er'和'-or'后缀
· JDK 24 发布,新特性解读!
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· SQL Server如何跟踪自动统计信息更新?