POJ 1195 Mobile phones 题解

来源:互联网 发布:软件存储权限 编辑:程序博客网 时间:2024/06/05 22:40

题意

刚开始有一个S*S的全0矩阵,每一次操作是给某一位置增加一个数(可能是负数)并保持非负(如果为负数就清0)或者询问某个矩形区间的数字之和

思路

用二维树状数组维护区间和,注意输入的坐标范围从0开始所以要先加1,以及保持每个位置的非负性

代码

#include <cstdio>int BIT[1025][1025],cnt[1025][1025];int Ins,S,X,Y,A,L,B,R,T;int lowbit(int x){    return x&(-x);}void add(int x,int y,int d){    for(int i=x;i<=S;i+=lowbit(i))        for(int j=y;j<=S;j+=lowbit(j))            BIT[i][j]+=d;}int sum(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+=BIT[i][j];    return ans;}int main(){    while(1)    {        scanf("%d",&Ins);        if(Ins==0)            scanf("%d",&S);        else if(Ins==1)        {            scanf("%d%d%d",&X,&Y,&A);            X++;            Y++;            if(A<-cnt[X][Y])                A=-cnt[X][Y];            add(X,Y,A);            cnt[X][Y]+=A;        }        else if(Ins==2)        {            scanf("%d%d%d%d",&L,&B,&R,&T);            L++;            B++;            R++;            T++;            printf("%d\n",sum(R,T)-sum(L-1,T)-sum(R,B-1)+sum(L-1,B-1));        }        else if(Ins==3)            break;    }    return 0;}
原创粉丝点击