hdu 1892 树状数组

思路:就是一个很普通的二维树状数组,注意的是x1,y1不一定在x2,y2的左下方

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define Maxn 1105
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn][Maxn],n=1010,LIST[Maxn][Maxn];
int Sum(int i,int j)
{
    int sum=0;
    int y;
    y=j;
    while(i)
    {
        j=y;
        while(j)
        {
            sum+=C[i][j];
            j-=lowbit(j);
        }
        i-=lowbit(i);
    }
    return sum;
}
void update(int i,int j,int val)
{
    int y,z;
    y=j;
    while(i<=n)
    {
        j=y;
        while(j<=n)
        {
            C[i][j]+=val;
            j+=lowbit(j);
        }
        i+=lowbit(i);
    }
}
int main()
{
    int x1,x2,y1,y2,q,t,num,i,Case=0,j;
    char str[2];
    for(i=1;i<=1005;i++)
        for(j=1;j<=1005;j++)
            update(i,j,1);
    for(i=1;i<=1005;i++)
        for(j=1;j<=1005;j++)
        LIST[i][j]=C[i][j];
    scanf("%d",&t);
    Case=0;
    while(t--)
    {
        memcpy(C,LIST,sizeof(C));
        scanf("%d",&q);
        printf("Case %d:
",++Case);
        for(i=1;i<=q;i++)
        {
            scanf("%s",&str);
            if(str[0]=='S')
            {
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x1++,y1++,x2++,y2++;
                int a1,b1,a2,b2;
                a1=min(x1,x2);a2=max(x1,x2);b1=min(y1,y2);b2=max(y1,y2);
                printf("%d
",Sum(a2,b2)-Sum(a1-1,b2)-Sum(a2,b1-1)+Sum(a1-1,b1-1));
            }
            if(str[0]=='A')
            {
                scanf("%d%d%d",&x1,&y1,&num);
                x1++,y1++;
                update(x1,y1,num);
                //printf("%d**
",Sum(x1,y1));
            }
            if(str[0]=='D')
            {
                int temp;
                scanf("%d%d%d",&x1,&y1,&num);
                x1++,y1++;
                temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1);
                if(temp>=num)
                    update(x1,y1,-num);
                else
                    update(x1,y1,-temp);
            }
            if(str[0]=='M')
            {
                scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&num);
                x1++,y1++,x2++,y2++;
                int temp=Sum(x1,y1)-Sum(x1-1,y1)-Sum(x1,y1-1)+Sum(x1-1,y1-1);
                if(temp>=num)
                {
                    update(x1,y1,-num);
                    update(x2,y2,num);
                }
                else
                {
                    update(x1,y1,-temp);
                    update(x2,y2,temp);
                }
            }
        }
    }
    return 0;
}
原文地址:https://www.cnblogs.com/wangfang20/p/3229248.html