http://poj.org/problem?id=1195二维树状数组

题意:给你一个n*n的矩阵,然后对其进行操作

①一种操作:给(x,y,A)在坐标(x,y)上增加A,然后对子矩阵进行更新。

②另一种操作:查找子矩阵(x1,y1,x2,y2)对其求值。

思路:利用二维树状数组,对子矩阵进行更新和查找

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string.h>
#define maxn 1111
using namespace std;
int map[maxn][maxn];
int t,S;
int X,Y,A;
int L,B,R,T;
int lowbit(int n)
{
    return (-n)&n;
}
void up_data(int x,int y,int num)
{
    while(x<=S)
    {
        int n=y;
        while(n<=S)
        {
            map[x][n]+=num;
            n+=lowbit(n);
        }
        x+=lowbit(x);
    }
}
int get_sum(int x,int y)
{
    int ans=0;
    while(x>0)
    {
        int n=y;
        while(n>0)
        {
            ans+=map[x][n];
            n-=lowbit(n);
        }
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    int op;
    while(scanf("%d%d",&t,&S)!=EOF)
    {
        memset(map,0,sizeof(map));
        int flag=0;
        while(1)
        {
            scanf("%d",&op);
            switch(op)
            {
            case 1:
                scanf("%d%d%d",&X,&Y,&A);
                up_data(X+1,Y+1,A);
                break;
            case 2:
                scanf("%d%d%d%d",&L,&B,&R,&T);
                L++;
                B++;
                R++;
                T++;
                int ans1,ans2,ans3,ans4;
                ans1=get_sum(R,T);
                ans2=get_sum(L-1,B-1);
                ans3=get_sum(R,B-1);
                ans4=get_sum(L-1,T);
                printf("%d\n",ans1+ans2-ans3-ans4);
                break;
            case 3:
                flag=1;
                break;
            }
            if(flag)
                break;
        }
    }
    return 0;
}


你可能感兴趣的:(http://poj.org/problem?id=1195二维树状数组)