码迷,mamicode.com
首页 > 编程语言 > 详细

POJ1195 Mobile phones【树状数组】【二维】

时间:2015-05-14 14:16:06      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

http://poj.org/problem?id=1195


题目大意:

给出一个N*N的矩阵,初始化都为0,坐标从(0,0)开始。有三个操作:

命令1:1 x y w;将坐标为(x,y)处的点值增加w

命令2:2 x1 y1 x2 y2;询问左下角坐标为(x1,y1)、右上角坐标为(x2,y2)的矩阵和是多少

命令3:3;不需要操作,退出。


思路:

二位树状数组单点更新,区间求值的简单题。直接做就可以了。最后求矩阵和的时候考虑容斥定理。

即ans = Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2)。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define LL __int64
using namespace std;
const int MAXN = 1100;

int Tree[MAXN][MAXN],N = 1025;

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

void Update(int x,int y,int w)
{
    for(int i = x; i <= N; i += Lowbit(i))
        for(int j = y; j <= N; j += Lowbit(j))
            Tree[i][j] += w;
}

LL Query(int x,int y)
{
    LL 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;
}

int main()
{
    int op,n;
    while(~scanf("%d%d",&op, &n))
    {
        memset(Tree,0,sizeof(Tree));
        while(~scanf("%d",&op) && op != 3)
        {
            if(op == 1)
            {
                int x,y,w;
                scanf("%d%d%d",&x,&y,&w);
                Update(x+1,y+1,w);
            }
            else if(op == 2)
            {
                int x1,y1,x2,y2;
                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                x1++,y1++,x2++,y2++;
                printf("%I64d\n",Query(x1-1,y1-1)-Query(x1-1,y2)-Query(x2,y1-1)+Query(x2,y2));
            }
        }

    }

    return 0;
}


POJ1195 Mobile phones【树状数组】【二维】

标签:

原文地址:http://blog.csdn.net/lianai911/article/details/45719439

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!