线段树&树状数组
树状数组
树状数组板子 注意在主函数中使用的时候 假设数组为n 需要写为BiTree(n + 1) 因为树状数组范围是1~n
1 | |
307. 区域和检索 - 数组可修改 - 力扣(LeetCode)
树状数组模板题 求不断修改数组的情况下的区间和
主要是add函数 for循环结束条件是i < tree.size()
然后修改了数组元素 要把数组变为val 然后tree里面的值也相应地要修改 修改了delta
1 | |
3072. 将元素分配到两个数组中 II - 力扣(LeetCode)
离散化+树状数组
由于数的范围在1e9 太大了 数组开不下 所以要用离散化 为什么可以离散化 因为他只是为了比大小 那把数去重排序后映射到1~n的区间就行了 由于树状数组从1开始 建议映射也从1开始
用unordered_map把每个数映射
树状数组的部分 首先把板子打上
树状数组 存什么呢? 别的题树状数组(如上题)可能是存前缀和 但是这个题目不一样 他主要是看前面有几个数比他大 我们又已经把数映射了 所以每次add的时候就加1表示index这个地方多了一个数 那么算出来的前缀和就是到1~n这个地方共有几个数 那就是比他小的数的个数 再用size减一下就得到比他大的数的个数
1 | |
1265. 数星星 - AcWing题库
主要是要理解树状数组的含义 update函数到底在加什么
像这种计数的题目 而不是求数组区间和 一般就是update(i, 1)表示在i处多了一个什么什么东西
然后还有这个题的细节 求ans[t.pre(x)]++要先求 因为如果先update的话 x这个地方就多了1(他自己)但是题目要求自己不算
1 | |
线段树
下面几道都是板子题 分别代表线段树处理不同的查询
1270. 数列区间最大值 - AcWing题库(add and max)
1 | |
add and sum
1 | |