#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define maxn 1002
using namespace std;
int map[maxn][maxn];
int T,t,Q;
int x1,y1,x2,y2,n1;
int lowbit(int n)
{
return (-n)&n;
}
int get_sum(int x,int y)
{
int ans=0;
for(int i=x; i>0; i-=lowbit(i))
for(int j=y; j>0; j-=lowbit(j))
{
ans+=map[i][j];
}
return ans;
/*
while(x>0)
{
int tem=y;
while(tem>0)
{
ans+=map[x][tem];
tem-=lowbit(tem);
}
x-=lowbit(x);
}
return ans;
*/
}
void up_data(int x,int y,int n)
{
for(int i=x; i<maxn; i+=lowbit(i))
for(int j=y; j<maxn; j+=lowbit(j))
{
map[i][j]+=n;
}
/*
while(x<=t+1)
{
int tem=y;
while(tem<=t+1)
{
map[x][tem]+=n;
tem+=lowbit(tem);
}
x+=lowbit(x);
}
*/
}
int get_MAX(int a,int b)
{
return a>b?a:b;
}
int get_MIN(int a,int b)
{
return a>b?b:a;
}
int main()
{
char op;
cin>>T;
int tem;
int step=0;
while(T--)
{
cin>>t;
memset(map,0,sizeof(map));
for(int i=1; i<maxn; i++)
for(int j=1; j<maxn; j++)
up_data(i,j,1);
printf("Case %d:\n",++step);
for(int r=1; r<=t; r++)
{
cin>>op;
switch(op)
{
case 'A':
cin>>x1>>y1>>n1;
up_data(x1+1,y1+1,n1);
break;
case 'D':
cin>>x1>>y1>>n1;
tem=get_sum(x1+1,y1+1)-(get_sum(x1+1,y1)+get_sum(x1,y1+1)-get_sum(x1,y1));
if(tem<n1)
n1=tem;
up_data(x1+1,y1+1,-n1);
break;
case 'M':
cin>>x1>>y1>>x2>>y2>>n1;
tem=get_sum(x1+1,y1+1)-(get_sum(x1+1,y1)+get_sum(x1,y1+1)-get_sum(x1,y1));
if(tem<n1)
n1=tem;
up_data(x1+1,y1+1,-n1);
up_data(x2+1,y2+1,n1);
break;
case 'S':
cin>>x1>>y1>>x2>>y2;
int Max=get_MAX(x1,x2);
int May=get_MAX(y1,y2);
int Mix=get_MIN(x1,x2);
int Miy=get_MIN(y1,y2);
int ans1=get_sum(Max+1,May+1);
int ans2=get_sum(Mix,Miy);
int ans3=get_sum(Max+1,Miy);
int ans4=get_sum(Mix,May+1);
// printf("ans1=%d ans2=%d ans3=%d ans4=%d\n",ans1,ans2,ans3,ans4);
cout<<ans1+ans2-ans3-ans4<<endl;
break;
}
}
}
return 0;
}
题意:ACMer的感情纠结,有一个房间被分成一个个格子,然后书自能放到这些格子里面,对他们进行四种操作:增,删,改,查。
思路:二维树状数组,各种bug,改了n天了,如果选择for()让我AC,我愿意放弃while().