poj 1195 Mobile phones(树状数组)

来源:互联网 发布:java 迭代子模式 编辑:程序博客网 时间:2024/06/01 19:24

题目链接:http://poj.org/problem?id=1195

题目大意:

1 .

0 n 给定一个n*n的所有点都为0的矩阵

1 a b x表示把[a,b]值加上x

2 x1 y1 x2 y2表示x1<= x <= x2 , y1 <= y <= y2求这个小矩形的面积

3 表示输入结束

2 简单的二维树状数组,但是这边要注意的是操作2的时候一定不能够把维度给弄反了,x1 x2表示的是x的范围而y1 y2表示的是y的范围
3 题目还有一个trick就是当[a,b]加上x后如果值为负数,那么应该把值设为0(WA点)

4.求和的操作理解一下  

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MAXN =1050;int n;int num[MAXN][MAXN];long long treeNum[MAXN][MAXN];int lowbit(int x){    return x&(-x);}/*int getSum(int x){//一维    int sum = 0;    while(x){//将以x为根节点的数 相当于求其叶节点的和  但其非叶节点等于其两个子节点的和        sum += treeNum[x];        x -= lowbit(x);    }    return sum;}*/long long  getSum(int x,int y){//二维   long long sum = 0;  for(int i=x;i>0;i-=lowbit(i))for(int j=y;j>0;j-=lowbit(j)){sum += treeNum[i][j];}    return sum;}/*void add(int x , int val){//一维    while(x < MAXN){//相当于一个树  他将其自己以及他的父节点一路向上都加val         treeNum[x] += val;         x += lowbit(x);    }}*/void add(int x ,int y, int val){//二维 if(num[x][y]+val < 0)        val = -num[x][y];num[x][y]+=val;    for(int i=x;i<MAXN;i+=lowbit(i))for(int j=y;j<MAXN;j+=lowbit(j))        {treeNum[i][j] += val;}}int main(){int x,y,c;int a,b;int k;    while(~scanf("%d" , &k)){if(k==0){memset(treeNum,0,sizeof treeNum);memset(num,0,sizeof num);scanf("%d",&n);}else if(k==1){scanf("%d%d%d",&x,&y,&c);x++,y++;add(x,y,c);}else if(k==2){scanf("%d%d%d%d",&x,&y,&a,&b);x++,y++,a++,b++;long long ans=0;ans=getSum(a,b)-getSum(x-1,b)-getSum(a,y-1)+getSum(x-1,y-1);printf("%lld\n",ans);}elsebreak;    }    return 0;}


原创粉丝点击