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

点我看题目

题意 : 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开始。

#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

 

你可能感兴趣的:(mobile)