poj-1195(二维树状数组)

题目链接:传送门

题意:给出操作,按照操作进行。

思路:将树状数组设置为二维的就行了。

注意:

(1)每次求出的面积是S(x2,y2)-S(x1-1,y2)-S(x2,y1-1)+S(x1-1,y1-1)。

(2)树状数组的lowbit不允许0。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 2050;
int c[maxn][maxn],lowbit[maxn],N;
void update(int x,int y,int Item)
{
    for(int i=x;i<=N;i+=lowbit[i])
        for(int j=y;j<=N;j+=lowbit[j])
        c[i][j]+=Item;
}
int query(int x,int y)
{
    int sum=0;
    for(int i=x;i>0;i-=lowbit[i])
        for(int j=y;j>0;j-=lowbit[j])
        sum+=c[i][j];
    return sum;
}
int get_ans(int x,int y,int A,int B)
{
    return query(A+1,B+1)+query(x,y)-query(x,B+1)-query(A+1,y);
}
int main(void)
{
    int i,j,x,y,A,B,pos;
    for(i=1;i<maxn;i++) lowbit[i]=i&(-i);
    while(1)
    {
        scanf("%d",&pos);
        if(pos==1)
        {
            scanf("%d%d%d",&x,&y,&A);
            update(x+1,y+1,A);
        }
        else if(pos==2)
        {
            scanf("%d%d%d%d",&x,&y,&A,&B);
            int ans=get_ans(x,y,A,B);
            printf("%d
",ans);
        }
        else if(pos==0)
        {
            scanf("%d",&N);
            memset(c,0,sizeof(c));
        }
        else break;
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/2018zxy/p/10187695.html