HDU 1892 二维树状数组

简介:

题意给的操作讲的很明白 注意不能出现负数 坐标值可能为0 两个坐标大小不能确定 

#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1002;
int tree[maxn + 2][maxn + 2];
int n;
inline int Lowbit(int x)
{
    return x&(-x);
}
inline void Update(int x,int y,int v)
{
    for(int i=x; i<=maxn; i+=Lowbit(i))
        for(int j=y; j<=maxn; j+=Lowbit(j))
            tree[i][j]+=v;
}
inline int Query(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+=tree[i][j];
    return sum;
}
inline int getv(int x,int y)
{
    return Query(x,y)-Query(x-1,y)-Query(x,y-1)+Query(x-1,y-1);
}
int main()
{
    int t,n,cas=0;
    char c[2];
    cin>>t;
    while(t--)
    {
        scanf("%d",&n);
        memset(tree,0,sizeof(tree));
        for(int i=1; i<=maxn; i++)
            for(int j=1; j<=maxn; j++)
                Update(i,j,1);
        printf("Case %d:\n",++cas);
        while(n--)
        {
            scanf("%s",c);
            if(c[0]=='S')
            {
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x1++,y1++,x2++,y2++;
                if(x1>x2) swap(x1,x2);
                if(y1>y2) swap(y1,y2);
                int s=Query(x2,y2)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x1-1,y1-1);
                printf("%d\n",s);
            }
            else if(c[0]=='A')
            {
                int x,y,n;
                scanf("%d%d%d",&x,&y,&n);
                x++,y++;
                Update(x,y,n);
            }
            else if(c[0]=='D')
            {
                int x,y,n;
                scanf("%d%d%d",&x,&y,&n);
                x++,y++;
                int s=getv(x,y),d=n<s?n:s;
                Update(x,y,-d);
            }
            else if(c[0]=='M')
            {
                int x1,y1,x2,y2,n;
                scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&n);
                x1++,y1++,x2++,y2++;
                int s=getv(x1,y1),d=n<s?n:s;
                Update(x2,y2,d);
                Update(x1,y1,-d);
            }
        }
    }
    return 0;
}


目录
相关文章
畅通工程 HDU - 1232
畅通工程 HDU - 1232
84 0
|
Java BI
HDU 1412 {A} + {B}
{A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19833    Accepted Submission(s): 8245 Problem Description 给你两个集合,要求{A} + {B}.
841 0
|
机器学习/深度学习
|
机器学习/深度学习
|
机器学习/深度学习 人工智能