模板
模板
int lowbit(int x)
{
return x & (-x);
}
void modify(int x,int add)//一维
{
while(x<=MAXN)
{
a[x]+=add;
x+=lowbit(x);
}
}
int get_sum(int x)
{
int ret=0;
while(x!=0)
{
ret+=a[x];
x-=lowbit(x);
}
return ret;
}
void modify(int x,int y,int data)//二维
{
for(int i=x;i<MAXN;i+=lowbit(i))
for(int j=y;j<MAXN;j+=lowbit(j))
a[i][j]+=data;
}
int get_sum(int x,int y)
{
int res=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
res+=a[i][j];
return res;
}
poj 1195
求出任意一个子矩阵内的所有元素之和,即sum(x2, y2) - sum(x1-1, y2) - sum(x2, y1-1) + sum(x1-1, y1-1)
在这道题目中,要注意下标是从 0 开始的。树状数组下标是从1 开始,所有要自加。
#include <stdio.h>
#include <memory.h>
#define S 1050
int c[S][S],s;
int lowbit(int x)
{
return x&(-x);
}
void modify(int x,int y,int add)
{
for(int i=x;i<=s+2;i+=lowbit(i))
for(int j=y;j<=s+2;j+=lowbit(j))
c[i][j]+=add;
}
int sum(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+=c[i][j];
return ret;
}
int main()
{
int op,val,x1,x2,y1,y2,ans;
while(scanf("%d",&op)&&op!=3)
{
if(op==0)
{
scanf("%d",&s);
memset(c,0,sizeof(c));
}
if(op==1)
{
scanf("%d%d%d",&x1,&y1,&val);
modify(x1+1,y1+1,val);
}
if(op==2)
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++,x2++,y1++,y2++;
ans =sum(x2,y2)-sum(x2,y1-1)-sum(x1-1,y2)+sum(x1-1,y1-1);
printf("%d\n",ans);
}
}
}