[小丁笔记] 数据结构
树状数组
-
有效坐标为[1,maxn]
-
直觉告诉我0下标会出问题
-
只有线性可加的操作才能用树状数组维护
-
可以使用倒序等方法加速查询速度
-
单点修改区间查询:
inline int lowbit(int x){ return x&(-x); } int sum(int pos){ if(pos==0) return 0; int res=0; while(pos){ res+=tree[pos]; pos-=lowbit(pos); } return res; } int sum(int posx,int posy){ return sum(posy)-sum(posx-1); } void add(int pos,int del){ while(pos<=maxn){ tree[pos]+=del; pos+=lowbit(pos); } }
区间修改区间查询
-
一定要注意数据范围!因为
-
若 a[ ] 差分后的数组为 b[ ], 在 b[ ] 上建立树状数组 tree
-
的区间修改可以表示为 和
-
的单点查询可以表示为
-
区间查询推导
-
可以表示为
-
所以 , 左式中
-
化简得
-
-
因此,需要多维护一个数组 ,
每当区间修改时,增加操作 和 即可
树状数组求第k大
-
求和的逆序,即在树状数组上以最高位进行二分,这个过程的行为很像线段树的解法
-
第k的序号从1开始
-
实现方法非常优美:
int find_kth(int k){ int ans = 0, cnt = 0; // ans可以看作当前点指针 for (int i = 20;i >= 0;i--){ //20指代lg(MAX_VAL) ans += (1 << i); if (ans >= MAX_VAL || cnt + tree[ans] >= k) ans -= (1 << i); else cnt += tree[ans]; } return ans + 1 }
二维树状数组
- 将树状数组拓展到二维
- 每个点存储的范围变成一个矩形:
x轴范围是 ,
y轴范围是 - 统计二维前缀和的时候只需要求 个点的和即可,如图所示:
单点修改区间查询
- 同树状数组,改成二重循环枚举 个覆盖点即可
- 区间查询:做四次前缀和查询
区间修改单点查询
- 将原二维数组变为二维差分,于是问题直接转换为了单点修改区间查询
区间修改区间查询
标签:
小丁的blog
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!