http://acm.hdu.edu.cn/showproblem.php?pid=1892&&二维树状数组

二维树状数组,,,,今天长见识了。。。

这一题题意:对一个矩形框的书进行,插入,挪动,删除。。。。

#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;

}


你可能感兴趣的:(http://acm.hdu.edu.cn/showproblem.php?pid=1892&&二维树状数组)