1512.SuperBrother打鼹鼠

描述

在这个“打鼹鼠”的游戏中,鼹鼠会不时地从洞中钻出来,不过不会从洞口钻进去(鼹鼠真胆大……)。洞口都在一个大小为n(n<=1024)的正方形中。这个正方形在一个平面直角坐标系中,左下角为(0,0),右上角为(n-1,n-1)。洞口所在的位置都是整点,就是横纵坐标都为整数的点。而SuperBrother也不时地会想知道某一个范围的鼹鼠总数。这就是你的任务。

格式

输入格式

每个输入文件有多行。

第一行,一个数n,表示鼹鼠的范围。

以后每一行开头都有一个数m,表示不同的操作:
m=1,那么后面跟着3个数x,y,k(0<=x,y m=2,那么后面跟着4个数x1,y1,x2,y2(0<=x1<=x2 m=3,表示老师来了,不能玩了。保证这个数会在输入的最后一行。

询问数不会超过10000,鼹鼠数不会超过maxlongint。

输出格式

对于每个m=2,输出一行数,这行数只有一个数,即所询问的区域内鼹鼠的个数。

tips:简单的二维数组题,但是要注意(x1,y1)(x2,y2)的区域是包括(x1,y1)这个点的,然后就没啥要注意的了

圣诞快乐�

#include 
#include 
#include 

using namespace std;
int N;

int lowbit(int i) {return i & (-i);}
void add(int x,int y,int k,int **map)
{
    for (int n = x;n <= N;n += lowbit(n))
        for (int m = y;m <= N;m += lowbit(m))
            map[n][m] += k;
           
}
int find(int x,int y,int **map)
{
    int tmp = 0;
    for (int n = x;n >= 1;n -= lowbit(n))
        for (int m = y;m >= 1;m -= lowbit(m))
             tmp += map[n][m];
    return tmp;
}

int main()
{
    scanf("%d",&N);
    int **map = new int *[N+1];
    for (int n = 0; n < N+1;n++)
        map[n] = new int [N+1];
    for (int n = 0;n <= N;n++)
        for (int m = 0;m <= N;m++)
            map[n][m] = 0;
    int m;
    while (scanf("%d",&m) && m!=3)
    {
        switch (m)
        {
            case 1:
                int x,y,k;
                scanf("%d%d%d",&x,&y,&k);
                x++;
                y++;
                add(x,y,k,map);
                break;
            case 2:
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x2++;
                y2++;
                int tmp = find(x2,y2,map) - find(x2,y1,map) - find(x1,y2,map) + find(x1,y1,map);
                printf("%d\n",tmp);
                break;
        }
    }
    for (int n = 0;n < N+1;n++)
        delete map[n];
    delete [] map;
    return 0;
}



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