poj 1195 Mobile phones
2015-03-31 00:59
435 查看
题目大意:
有几种操作0 a:申请a*a的矩阵并且置零,只在第一条语句出现;
1 x y a:在(x,y)这个点加a
2 x1 y1 x2 y2 :求这个区间的和
3:结束
解题思路:
基本的二维树状数组操作,需要注意的是下标从0开始,所以遇到处理坐标的情况增加一位便可,避免处理0;#include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define maxn 1050 int m,n; int c[maxn][maxn]; int num[maxn][maxn]; int lowbit(int x) { return x&(-x); } void updata(int x,int y,int add) { num[x][y]+=add; for(int i=x;i<=m;i+=lowbit(i)) { for(int j=y;j<=n;j+=lowbit(j)) c[i][j]+=add; } } 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+=c[i][j]; } return ans; } int main() { int op; while(scanf("%d",&op)) { if(op==0) { memset(c,0,sizeof(c)); memset(num,0,sizeof(num)); int temp; scanf("%d",&temp); n=m=temp; } else if(op==1) { int a,b,c; scanf("%d%d%d",&a,&b,&c); updata(a+1,b+1,c); } else if(op==2) { int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2); x1++,x2++,y1++,y2++; printf("%d\n",sum(x2, y2)+sum(x1-1, y1-1)-sum(x1-1, y2)-sum(x2, y1-1)); } else break; } }
相关文章推荐
- poj 1195 Mobile phones
- 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 (二维树状数组)
- poj 1195 Mobile phones 【二维树状数组】
- POJ 1195 Mobile phones 二维线段树
- poj 1195 Mobile phones (二维树状数组)
- POJ 1195 Mobile phones (二维树状数组)
- POJ 1195 Mobile phones
- POJ 1195 Mobile phones 二维树状数组
- POJ 1195 Mobile phones - 二维树状数组/线段树
- poj 1195 Mobile phones
- Poj 1195 Mobile phones
- poj 1195 mobile phones
- 【原】 POJ 1195 Mobile phones 2D树状数组 解题报告