题意:一个s*s的矩阵,初始都是0,有若干次操作,要么增加某个元素的值,要么查询某个范围的和。
思路:二维树状数组模板题。。
#include<iostream>
#include<queue>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>
using namespace std;
#define ll long long
#define INF 1000000000
inline int lowbit(int x){
return x&(-x);
}
int s;
int c[1030][1030];
void update(int row,int col,int v){
int tcol=col;
while(row<=s){
col=tcol;
while(col<=s){
c[row][col]+=v;
col+=lowbit(col);
}
row+=lowbit(row);
}
}
int query(int row,int col){
int re=0;
int tcol=col;
while(row){
col=tcol;
while(col){
re+=c[row][col];
col-=lowbit(col);
}
row-=lowbit(row);
}
return re;
}
int main(){
int op;
while(scanf("%d",&op)){
if(op==3)break;
if(op==0){
scanf("%d",&s);
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
c[i][j]=0;
}
if(op==1){
int x,y,a;
scanf("%d%d%d",&x,&y,&a);
update(x+1,y+1,a);
}
if(op==2){
int l,b,r,t;
scanf("%d%d%d%d",&l,&b,&r,&t);
int ans=query(r+1,t+1)-query(r+1,b)-query(l,t+1)+query(l,b);
cout<<ans<<endl;
}
}
return 0;
}
本文介绍了一道关于二维树状数组的经典算法题目。通过一个s*s的矩阵,演示了如何进行元素值的更新及特定范围内元素和的查询操作。文章提供了完整的C++代码实现,并详细解释了二维树状数组的构建过程。
489

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



