二维树状数组
模板题:LOJ133
就是区间上的问题搬到了矩阵上。
但其实矩阵上的问题处理起来并不容易。比如这道题,涉及矩阵最大值,必须采用二维线段树(线段树套线段树)的方式进行维护,非常繁琐。
但对于LOJ133这道题,因为只有单点修改区间求和,所以考虑使用二维树状数组,即树状数组套树状数组。而二维树状数组写起来就要简单多了。
比如说,我们要维护一个 的矩阵。我们可以考虑对行建立一个树状数组,再对每一行建立一个树状数组(如下图)。
方便起见,我们称外层树状数组(维护行)的结点为外层结点,内层树状数组(维护每一行)的结点为内层结点。
接下来就要支持两个操作了。实在是不好描述,直接放图了。
修改操作:比如我们修改了 这个位置的值,树状数组上要修改的位置如图:
实现:
树状数组没有线段树那样的繁琐结构,直接开二维数组就完事了。
void add(int x,int y,int k)
{
for(int i=x;i<=n;i+=lowbit(i))
for(int j=y;j<=m;j+=lowbit(j))
a[i][j]+=k;
}
查询同理。显然矩阵查询可以化归为对以 为左上顶点的矩阵的查询。比如我们查询 :
code:
int query(int x,int y)
{
int ans=0;
for(int i=x;i>=1;i-=lowbit(i))
for(int j=y;j>=1;j-=lowbit(j))
ans+=a[i][j];
return ans;
}
//query(aa,bb;cc,dd)=query(cc,dd)-query(aa-1,dd)-query(cc,bb-1)+query(aa-1,bb-1)
嗯就这么简单。
作者:pjykk
出处:https://www.cnblogs.com/pjykk/p/15874466.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现