题目:http://poj.org/problem?id=1195
题意:给你N*N的矩阵,修改点,查矩阵的和。
分析:很裸的题了。。。
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn = 1048;
int tree[maxn][maxn],lowbit[maxn];
void Init()
{
for(int i=1;i<maxn;i++)
lowbit[i]=(i&-i);
}
void update(int x,int y,int c)
{
for(int i=x;i<maxn && i;i+=lowbit[i])
for(int j=y;j<maxn && j;j+=lowbit[j])
tree[i][j]+=c;
}
int query(int x,int y)
{
int ret(0);
for(int i=x;i>0;i-=lowbit[i])
for(int j=y;j>0;j-=lowbit[j])
ret+=tree[i][j];
return ret;
}
int main()
{
int N,q,R,T,L,B,x,y,v;
Init();
while(1)
{
scanf("%d",&q);
if(q==1)
{
scanf("%d%d%d",&x,&y,&v);
x++,y++;
update(x,y,v);
}
else if(q==2)
{
scanf("%d%d%d%d",&L,&B,&R,&T);
L++,B++,R++,T++;
printf("%d\n",query(R,T)-query(L-1,T)-query(R,B-1)+query(L-1,B-1));
}
else if(q==3)
return 0;
else
{
scanf("%d",&N);
for(int i=1;i<=N+3;i++)
memset(tree[i],0,sizeof(tree[0][0])*(N+3));
}
}
return 0;
}
本文介绍了一种使用二维稀疏矩阵进行高效更新和范围查询的方法,适用于处理大规模二维数据集的问题。通过实现更新和查询操作,可以快速地修改矩阵中的特定位置并计算指定矩形区域内的元素总和。

2448

被折叠的 条评论
为什么被折叠?



