首页 > 其他 > 详细

POJ 1195 Mobile phones(二维树状数组)

时间:2014-02-25 23:46:37      阅读:430      评论:0      收藏:0      [点我收藏+]

点我看题目

题意 : 4条命令,0代表开始,在整组样例里肯定只有第一条是0,0后边的数字代表的矩阵的大小为n*n,1 x y z代表着将z加到(x,y)这个格子上去,2 l b r t代表着,让你求出从(l,b)到(b,r)所包含的矩形中包含的移动电话的数量。

思路 :当时看书的时候我就看到二维数组了,一看这个题我就想到了用二维,二维其实和一维差不多,这个就是个模板题。不过依然要注意的是树状数组是从1开始的,所以输入之后要+1以防从0开始。

bubuko.com,布布扣
bubuko.com,布布扣
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int maxn = 4123 ;
int tree[1100][1100] ;
int n ;

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

void update(int i,int j,int k)
{
    while(i <= n)
    {
        int temp = j ;
        while(temp <= n)
        {
            tree[i][temp] += k ;
            temp += lowbit(temp) ;
        }
        i += lowbit(i) ;
    }
}

int sum(int i,int j)
{
    int sum1 = 0;
    while(i > 0)
    {
        int temp = j ;
        while(temp > 0)
        {
            sum1 += tree[i][temp] ;
            temp -= lowbit(temp) ;
        }
        i -= lowbit(i) ;
    }
    return sum1 ;
}

int main()
{
    int n1 ;
    int l,b,r,t ;
    memset(tree,0,sizeof(tree)) ;
    while(scanf("%d",&n1) && n1 < 3)
    {
        if(n1 == 0)
            scanf("%d",&n) ;
        else if(n1 == 1)
        {
            scanf("%d %d %d",&l,&b,&r) ;
            l++;
            b++ ;
            update(l,b,r) ;
        }
        else if(n1 == 2)
        {
            scanf("%d %d %d %d",&l,&b,&r,&t) ;
            l++ ;
            b++ ;
            r++ ;
            t++ ;
            int s = sum(r,t)-sum(l-1,t)-sum(r,b-1)+sum(l-1,b-1) ;
            printf("%d\n",s) ;
        }
    }
    return 0;
}
View Code
bubuko.com,布布扣

POJ 1195 Mobile phones(二维树状数组)

原文:http://www.cnblogs.com/luyingfeng/p/3566706.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!