题意:
一块矩形空间 一开始每个格子都是1 有4种操作: S操作将(x1,y1)-(x2,y2)所画出的矩形中的数求和 A操作是在(x,y)加z D是在(x,y)减z 注意不能减成负数 M是移动
思路:
裸二维树状数组… POJ上有楼教主出过的题
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1001
int a[N+5][N+5];
int n,T,t;
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int fd)
{
int i,j;
for(i=x;i<=N;i+=lowbit(i))
{
for(j=y;j<=N;j+=lowbit(j)) a[i][j]+=fd;
}
}
int sum(int x,int y)
{
int i,j,res=0;
for(i=x;i>0;i-=lowbit(i))
{
for(j=y;j>0;j-=lowbit(j)) res+=a[i][j];
}
return res;
}
int main()
{
int i,ux,uy,vx,vy,x,y;
char op[5];
scanf("%d",&T);
for(t=1;t<=T;t++)
{
memset(a,0,sizeof(a));
for(ux=1;ux<=N;ux++)
{
for(uy=1;uy<=N;uy++) add(ux,uy,1);
}
scanf("%d",&n);
printf("Case %d:\n",t);
while(n--)
{
scanf("%s",op);
if(op[0]=='S')
{
scanf("%d%d%d%d",&ux,&uy,&vx,&vy);
ux++,uy++,vx++,vy++;
if(ux>vx) swap(ux,vx);
if(uy>vy) swap(uy,vy);
printf("%d\n",sum(vx,vy)+sum(ux-1,uy-1)-sum(ux-1,vy)-sum(vx,uy-1));
}
else if(op[0]=='A')
{
scanf("%d%d%d",&ux,&uy,&x);
ux++,uy++;
add(ux,uy,x);
}
else if(op[0]=='D')
{
scanf("%d%d%d",&ux,&uy,&x);
ux++,uy++;
y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1);
if(y<x) x=y;
add(ux,uy,-x);
}
else if(op[0]=='M')
{
scanf("%d%d%d%d%d",&ux,&uy,&vx,&vy,&x);
ux++,uy++,vx++,vy++;
y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1);
if(y<x) x=y;
add(ux,uy,-x);
add(vx,vy,x);
}
}
}
return 0;
}