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:\n",++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\n",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**\n",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;

}

 

你可能感兴趣的:(树状数组)