二维树状数组,,,,今天长见识了。。。
这一题题意:对一个矩形框的书进行,插入,挪动,删除。。。。
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define N 1005
int s[N][N];
int lowbit(int x)
{return x&(-x);}
void update(int x,int y,int v)
{ for(int i=x;i<N;i+=lowbit(i))
for(int j=y;j<N;j+=lowbit(j))
s[i][j]+=v;
}
int Quary(int x,int y)
{ int sum=0;
for(int i=x;i>0;i-=lowbit(i))
for(int j=y;j>0;j-=lowbit(j))
sum+=s[i][j];
return sum;
}
int main()
{ int T;
scanf("%d",&T);
for(int k=1;k<=T;++k)
{ printf("Case %d:\n",k);
int n;
scanf("%d",&n);
char ch[10];
int a,b,c,d,e;
memset(s,0,sizeof(s));
for(int i=1;i<N;++i)
for(int j=1;j<N;++j)
update(i,j,1);
while(n--)
{ scanf("%s",ch);
if(ch[0]=='A')
{ scanf("%d%d%d",&a,&b,&c);
update(a+1,b+1,c);
}
else if(ch[0]=='D')
{ scanf("%d%d%d",&a,&b,&c);
int v=Quary(a+1,b+1)-Quary(a+1,b)-Quary(a,b+1)+Quary(a,b);
if(v<c) c=v;
update(a+1,b+1,-c);
}
else if(ch[0]=='M')
{ scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
int v=Quary(a+1,b+1)-Quary(a+1,b)-Quary(a,b+1)+Quary(a,b);
if(v<e) e=v;
update(a+1,b+1,-e);
update(c+1,d+1,e);
}
else if(ch[0]=='S')
{ scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>c) swap(a,c);
if(b>d) swap(b,d);
int res=Quary(c+1,d+1)-Quary(a,d+1)-Quary(c+1,b)+Quary(a,b);
printf("%d\n",res);
}
}
}return 0;
}