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;
}


目录
相关文章
|
Java 测试技术
hdu 1228 A + B
hdu 1228 A + B
44 0
|
Java
hdu 2503 a/b + c/d
hdu 2503 a/b + c/d
43 0
|
算法 Java
HDU 2084 数塔
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
174 0
HDU 2549 壮志难酬
壮志难酬 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12541    Accepted Submission(s): 4166 Problem Description 话说MCA山上各路豪杰均出山抗敌,去年曾在江湖威名显赫的,江湖人称的甘露也不甘示弱,“天将降大任于斯人也,必先劳其筋骨,饿其体肤,空乏其身”他说。
1027 0
|
机器学习/深度学习 人工智能