题意:
输入一串指令,每个指令一行
指令有4种
第一种:0 S,将一个S*S的矩阵初始化为0,编号为0,1,,,S-1
第二种:1 X Y A,将坐标(X,Y)的值加A
第三种:2 L B R T,求坐标(X,Y)的值总和,L<=X<=R,B<=Y<=T
第四种:3,结束
解法:
我开始想用一维的树状数组做,结果TLE了 。。
正解是二维树状数组,我的第一个二维树状数组
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
long long n;
#define MAX 1030
long long c[MAX][MAX];//二维的树状数组
long long lowbit(long long x)
{
return x&(-1*x);
}
void update(long long x,long long y,long long num)//和一维的很像吧。。
{
for(long long i=x;i<=n;i+=lowbit(i))
{
for(long long j=y;j<=n;j+=lowbit(j))
{
c[i][j]+=num;
}
}
}
long long getsum(long long x,long long y)//二维树状数组的求和函数
{
long long ans=0;
for(long long i=x;i>=1;i-=lowbit(i))
{
for(long long j=y;j>=1;j-=lowbit(j))
{
ans+=c[i][j];
}
}
return ans;
}
int main()
{
long long type;
scanf("%lld %lld",&type,&n);
memset(c,0,sizeof(c));//树状数组的初始化
while(scanf("%lld",&type),type!=3)
{
if(type==1)
{
long long x,y,num;
scanf("%lld %lld %lld",&x,&y,&num);
x++;y++;//这里要加1,因为输入中有0,我把所有序号都做加1的处理
update(x,y,num);
}
else
{
long long x1,y1,x2,y2;
scanf("%lld %lld %lld %lld",&x1,&y1,&x2,&y2);
x1++;
y1++;
x2++;
y2++;//加1的原因同上
printf("%lld\n",getsum(x2,y2)-getsum(x1-1,y2)-getsum(x2,y1-1)+getsum(x1-1,y1-1));//
}
}
return 0;
}