POJ 1195 Mobile phones【树状数组】
题意: 一组造作:
0 n 创建一个 n*n 的矩形。
1 x y num 在(x,y)位置加上值 num。
2 l b r t 输出矩阵 l<=x<=r,b<=y<=t 内所有数值和。
3 退出。
分析: 二维树状数组。
#include<stdio.h> #include<string.h> int a[1025][1025]; int n; int lowbit(int x) { return (x)&(-x); } void add(int x,int y,int num) { while(x<=n) { int ty=y; while(ty<=n) { a[x][ty]+=num; ty+=lowbit(ty); } x+=lowbit(x); } } int sum(int x,int y) { if(x==0||y==0) return 0; int sum=0; while(x>0) { int ty=y; while(ty>0) { sum+=a[x][ty]; ty-=lowbit(ty); } x-=lowbit(x); } return sum; } int main() { int p,x,y,num,l,b,r,t,i,j; while(scanf("%d",&p)!=EOF) { if(p==0) { scanf("%d",&n); for(i=0;i<=n;i++) for(j=0;j<=n;j++) a[i][j]=0; } else if(p==1) { scanf("%d%d%d",&x,&y,&num); x++; y++; add(x,y,num); } else if(p==2) { scanf("%d%d%d%d",&l,&b,&r,&t); l++; b++; r++; t++; printf("%d\n",sum(r,t)-sum(r,b-1)-sum(l-1,t)+sum(l-1,b-1)); } else break; } return 0; }