hdu 1892 See you~(二维树状数组)

二维树状·数组 讲解:https://blog.csdn.net/qq_18661257/article/details/47347995

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 1020
int n;
int c[1050][1050];
int a[1050][1050];
int lowbit(int x)
{
        return (x&(-x));
}
int add(int x,int y,int val)
{
        for (int i=x;i<=maxn;i+=lowbit(i))
                for (int j=y;j<=maxn;j+=lowbit(j))
                        c[i][j]+=val;
}
int que(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+=c[i][j];
        return ans;
}
int getSingle(int x, int y) {
    return que(x, y) + que(x-1, y-1) - que(x-1, y) - que(x, y-1);
}
int main(){
	//freopen("in.txt","r",stdin);
	int t,KASE=1;
	scanf("%d",&t);
	while(t--){

		printf("Case %d:\n",KASE++);
	
		memset(c,0,sizeof(c));
	
		for(int i=1;i<=maxn;i++)
		for(int j=1;j<=maxn;j++){
			add(i,j,1);
		}
		scanf("%d",&n);
		for(int i=0;i<n;i++){
			getchar();
			char op;
			scanf("%c",&op);
			int x1,y1;
			if(op=='S')
			{
				int x2,y2;
				scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
				if(x1>x2)swap(x1,x2);
				if(y1>y2)swap(y1,y2);
				printf("%d\n",que(x2+1,y2+1)-que(x1,y2+1)-que(x2+1,y1)+que(x1,y1));	
			} else if (op=='A'){
				int n1;
				scanf("%d%d%d",&x1,&y1,&n1);
				add(x1+1,y1+1,n1);
			} else if(op=='D'){
				int n1;
				scanf("%d%d%d",&x1,&y1,&n1);
				n1=min(n1,getSingle(x1+1,y1+1));
				add(x1+1,y1+1,-n1);		
			} else{
				int x2,y2,n1;
				scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n1);	
				n1=min(n1,getSingle(x1+1,y1+1));
				add(x1+1,y1+1,-n1);
				add(x2+1,y2+1,n1);
			}	
		}
	} 
	return 0;
}


猜你喜欢

转载自blog.csdn.net/l2533636371/article/details/80039158
今日推荐