【poj 1195】Mobile phones 题意&题解&代码(C++)

题目链接:
http://poj.org/problem?id=1195
题意:
每行第一个数,如果为0,后面一个数字s,表示给出一个s*s的矩阵,初始化为均为0,如果为 1 :(X Y A)对位于坐标(X Y)的值加A;如果为 2:(L B R T)求出位于L<=x<=R,B<=y<=T的值的和;如果为 3:结束程序。
题解:
二维的树状数组。
比较好的博客:
http://blog.csdn.net/lin375691011/article/details/21247409
代码:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int num[1050][1050],s;
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int y,int v)
{
    for (int i=x;i<=s;i+=lowbit(i))
    for (int j=y;j<=s;j+=lowbit(j))
    num[i][j]+=v;
}
int query(int x,int y)
{
    int ans=0;
    for (int i=x;i>0;i-=lowbit(i))
    for (int j=y;j>0;j-=lowbit(j))
    ans+=num[i][j];
    return ans;
}
int n,m,p,x1,x2,y1,y2,tmp;
int main()
{
    while(scanf("%d",&p))
    {
        if (p==0) scanf("%d",&s);
        if (p==3) return 0;
        if (p==1)
        {
            scanf("%d%d%d",&x1,&y1,&tmp);
            x1++;y1++;
            add(x1,y1,tmp);
        }
        else if (p==2)
        {
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
            x1++;y1++;x2++;y2++;
            int zans=query(x2,y2)-query(x2,y1-1)-query(x1-1,y2)+query(x1-1,y1-1);
            printf("%d\n",zans);
        }
    }
}

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