首页 > 代码库 > HDU 1892 See you~

HDU 1892 See you~

题意:

一块矩形空间  一开始每个格子都是1  有4种操作: S操作将(x1,y1)-(x2,y2)所画出的矩形中的数求和  A操作是在(x,y)加z  D是在(x,y)减z 注意不能减成负数  M是移动


思路:

裸二维树状数组…  POJ上有楼教主出过的题


代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1001

int a[N+5][N+5];
int n,T,t;

int lowbit(int x)
{
    return x&(-x);
}

void add(int x,int y,int fd)
{
    int i,j;
    for(i=x;i<=N;i+=lowbit(i))
    {
        for(j=y;j<=N;j+=lowbit(j)) a[i][j]+=fd;
    }
}

int sum(int x,int y)
{
    int i,j,res=0;
    for(i=x;i>0;i-=lowbit(i))
    {
        for(j=y;j>0;j-=lowbit(j)) res+=a[i][j];
    }
    return res;
}

int main()
{
    int i,ux,uy,vx,vy,x,y;
    char op[5];
    scanf("%d",&T);
    for(t=1;t<=T;t++)
    {
        memset(a,0,sizeof(a));
        for(ux=1;ux<=N;ux++)
        {
            for(uy=1;uy<=N;uy++) add(ux,uy,1);
        }
        scanf("%d",&n);
        printf("Case %d:\n",t);
        while(n--)
        {
            scanf("%s",op);
            if(op[0]=='S')
            {
                scanf("%d%d%d%d",&ux,&uy,&vx,&vy);
                ux++,uy++,vx++,vy++;
                if(ux>vx) swap(ux,vx);
                if(uy>vy) swap(uy,vy);
                printf("%d\n",sum(vx,vy)+sum(ux-1,uy-1)-sum(ux-1,vy)-sum(vx,uy-1));
            }
            else if(op[0]=='A')
            {
                scanf("%d%d%d",&ux,&uy,&x);
                ux++,uy++;
                add(ux,uy,x);
            }
            else if(op[0]=='D')
            {
                scanf("%d%d%d",&ux,&uy,&x);
                ux++,uy++;
                y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1);
                if(y<x) x=y;
                add(ux,uy,-x);
            }
            else if(op[0]=='M')
            {
                scanf("%d%d%d%d%d",&ux,&uy,&vx,&vy,&x);
                ux++,uy++,vx++,vy++;
                y=sum(ux,uy)+sum(ux-1,uy-1)-sum(ux-1,uy)-sum(ux,uy-1);
                if(y<x) x=y;
                add(ux,uy,-x);
                add(vx,vy,x);
            }
        }
    }
    return 0;
}