POJ - 1195 Mobile phones解题报告(二维树状数组)
2017-04-27 16:04
429 查看
题目大意:
给你一个s*s的方阵,然后有若干操作:给指定点增加数量(可能为负);查询指定区域数量总和。用二维树状数组即可。关于二维树状数组:
还是用类比一维树状数组的想法,让在一个区域上一些位置上的数,来表示原数组一些特定区域上的点的值的和。具体的原理我会在下一篇树状数组总结中给出。魔板代码可以看一下这一篇的sum和add函数。代码:
#include<iostream> #include<string.h> #include<stdio.h> using namespace std; int s; long long int tree[1100][1100]; int lowbit(int x) { return x&(-x); } void add(int x,int y,int a) { for(int i=x;i<=s;i+=lowbit(i)) { for(int j=y;j<=s;j+=lowbit(j)) { tree[i][j]+=a; } } } long long int sum(int x,int y) { long long int s=0; for(int i=x;i>0;i-=lowbit(i)) { for(int j=y;j>0;j-=lowbit(j)) { s+=tree[i][j]; } } return s; } int main() { int l; while(scanf("%d",&l)) { if(l==3)return 0; if(l==0) { memset(tree,0,sizeof(tree)); scanf("%d",&s); } if(l==1) { int x,y,a; scanf("%d%d%d",&x,&y,&a); x++;y++; add(x,y,a); } if(l==2) { int l,b,r,t; scanf("%d%d%d%d",&l,&b,&r,&t); l++;b++;r++;t++; long long int ans=sum(r,t)-sum(r,b-1)-sum(l-1,t)+sum(l-1,b-1); if(ans<0)ans=0; printf("%d\n",ans); } } }
相关文章推荐
- poj 1195 Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)
- poj1195 Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)
- POJ - 1195 Mobile phones(二维树状数组)
- hdu 1541 Stars poj 1195 Mobile phones(二维) poj 2155 Matrix(二维) hdu 3584 Cube(三维) 树状数组
- poj 1195 Mobile phones(二维树状数组)
- POJ 1195 Mobile phones(二维树状数组)
- POJ 1195 Mobile phones(二维树状数组)
- POJ Mobile phones(1195)(二维树状数组)
- POJ 1195 MOBILE PHONES(二维树状数组)
- POJ1195 Mobile phones, 二维树状数组
- poj 1195 Mobile phones(二维树状数组)
- POJ 1195 Mobile phones(二维树状数组)
- poj-1195-Mobile phones(二维树状数组)
- POJ1195——Mobile phones(二维树状数组)
- poj 1195 Mobile phones(二维树状数组)