spoj 1029

来源:互联网 发布:英克软件多少钱 编辑:程序博客网 时间:2024/05/17 00:51

题目:https://www.spoj.pl/problems/MATSUM/


入门级二维树状数组。。其实二维和一维的思想差不多!


#include <cmath>#include <ctime>#include <iostream>#include <string>#include <vector>#include <cstdio>#include <cstdlib>#include <cstring>#include <queue>#include <map>#include <set>#include <algorithm>#include <cctype>#include <stack>#include <deque>using namespace std;typedef long long LL;#define EPS 10e-9#define INF 0x3f3f3f3f#define REP(i,n) for(int i=0; i<(n); i++)const int maxn = 1100;int c[maxn][maxn],ma[maxn][maxn];inline int lowbit(int x){ return x&-x;}void add(int x,int y,int num){    while(x<maxn){        int y1=y;        while(y1<maxn){          c[x][y1]+=num;  y1+=lowbit(y1);        }        x+=lowbit(x);    }}int sum(int x,int y){    int ret=0;    while(x>0){        int y1=y;       while(y1>0){          ret+=c[x][y1];  y1-=lowbit(y1);       }       x-=lowbit(x);    }    return ret;}int main(){    int t,n;  char str[10];  int x,y,num,x1,y1,x2,y2;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        memset(ma,0,sizeof(ma));        memset(c,0,sizeof(c));        while(1){           scanf("%s",str);           if(strcmp(str,"END")==0) break;           if(str[1]=='E'){               scanf("%d %d %d",&x,&y,&num);  x++;y++;               int temp=num-ma[x][y];               add(x,y,temp);               ma[x][y]=num;           }           else{               scanf("%d %d %d %d",&x1,&y1,&x2,&y2); x1++;y1++; x2++;y2++;               printf("%d\n",sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1));           }        }    }    return 0;}