POJ 1195 mobile phones 二维树状数组
题意很简单,就是求一定范围内子矩阵的和,数据量很大,用暴力的话一定会超时,这道题用二维的树状数组做比较简单。。。
#include<stdio.h> #include<string.h> #include <iostream> using namespace std; #define MAX 1030 int tree[MAX][MAX]; int S,ans; int lowbit(int x){return x&(-x);} void add(int x,int y,int num) { for(int i=x;i<=S;i+=lowbit(i)) { for(int j=y;j<=S;j+=lowbit(j)) { tree[i][j]+=num; } } } 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+=tree[i][j]; } } return sum; } int main() { setbuf(stdout,NULL); int instruction; scanf("%d %d",&instruction,&S); memset(tree,0,sizeof(tree)); while(scanf("%d",&instruction)!=EOF) { if(instruction==3)break; if(instruction==1) { int X,Y,A; scanf("%d %d %d",&X,&Y,&A); add(X+1,Y+1,A); } else { int L,B,R,T; scanf("%d %d %d %d",&L,&B,&R,&T); ans=query(R+1,T+1)+query(L,B)-query(L,T+1)-query(R+1,B); printf("%d\n",ans); } } return 0; }
posted on 2011-07-23 13:09 lonelycatcher 阅读(199) 评论(0) 编辑 收藏 举报