//Tree[i][j]=lowbit(i)*lowbit(j);
或
//先赋值为0; 每个位置放一本
/*void init()
{
int i,j;
for(i=1;i<=1001;i++)
{
for(j=1;j<=1001;j++)
{
a[i][j]=1;
Tree[i][j]=0;
}
}
for(i=1;i<=1001;i++)
{
for(j=1;j<=1001;j++)
{
modify(i,j,1);
}
}
}*/
#include <iostream>
using namespace std;
const int MAX=1002;
int n;
int a[MAX][MAX];
int Tree[MAX][MAX];
#define max(a,b)(a>b?a:b)
#define min(a,b)(a<b?a:b)
int lowbit(int i)
{
return i&(-i);
}
void init()
{
int i,j;
for(i=1;i<=1001;i++)
{
for(j=1;j<=1001;j++)
{
a[i][j]=1;
Tree[i][j]=lowbit(i)*lowbit(j);
}
}
}
void modify(int x,int y,int num)
{
int i,j;
for(i=x;i<=1001;i+=lowbit(i))
{
for(j=y;j<=1001;j+=lowbit(j))
{
Tree[i][j]+=num;
}
}
}
int sum(int x,int y)
{
int i,j,s=0;
for(i=x;i>0;i-=lowbit(i))
{
for(j=y;j>0;j-=lowbit(j))
{
s+=Tree[i][j];
}
}
return s;
}
void run(int Case)
{
int x1,y1,x2,y2,num,i;
char cmd;
printf("Case %d:\n",Case);
init();
int m;
scanf("%d",&m);
for(i=0;i<m;i++)
{
cin>>cmd;
if(cmd=='S')
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
x1++; y1++; x2++; y2++;
int minx,miny,maxx,maxy;
//要比较大小!!!
minx=min(x1,x2);
miny=min(y1,y2);
maxx=max(x1,x2);
maxy=max(y1,y2);
int ans=sum(maxx,maxy)-sum(maxx,miny-1)-sum(minx-1,maxy)+sum(minx-1,miny-1);
printf("%d\n",ans);
}
else if(cmd=='A')
{
scanf("%d%d%d",&x1,&y1,&num);
x1++; y1++;
a[x1][y1]+=num;
modify(x1,y1,num);
}
else if(cmd=='D')
{
scanf("%d%d%d",&x1,&y1,&num);
x1++; y1++;
if(a[x1][y1]<num) num=a[x1][y1];
a[x1][y1]-=num;
modify(x1,y1,-num);
}
else
{
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&num);
x1++; x2++; y1++; y2++;
if(a[x1][y1]<num) num=a[x1][y1];
a[x1][y1]-=num;
a[x2][y2]+=num;
modify(x1,y1,-num);
modify(x2,y2,num);
}
}
}
int main()
{
int T;
cin>>T;
for(int i=0;i<T;i++) run(i+1);
return 0;
}
HDU 1892 See you~ 二维树状数组
最新推荐文章于 2021-05-21 15:47:43 发布