您的位置:首页 > 其它

poj 1195 Mobile phones

2013-08-12 21:55 274 查看
点击打开链接poj 1195

思路: 二维树状数组

分析:

1 给定一个矩阵和三种操作 1 a b x表示把[a,b]值加上x,2 L B R T表示L <= x <= R , B <= y <= T

求这个小矩形的面积 3表示输入结束

2 简单的二维树状数组,但是这边要注意的是操作2的时候一定不能够把维度给弄反了,L R表示的是x的范围而B T表示

的是y的范围

3 题目还有一个trick就是当[a,b]加上x后如果值为负数,那么应该把值设为0

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int MAXN = 1030;

int s;
int num[MAXN][MAXN];
long long treeNum[MAXN][MAXN];

int lowbit(int x){
return x&(-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;
}

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;
}

int main(){
int x , i , j , val;
int l , r , u , d;
while(scanf("%d%d" , &x , &s) != EOF){
memset(treeNum , 0 , sizeof(treeNum));
memset(num , 0 , sizeof(num));
while(scanf("%d" , &x) && x != 3){
if(x == 1){
scanf("%d%d%d" , &i , &j , &val);
add(i+1 , j+1 , val);
}
else{
scanf("%d%d%d%d" , &u , &l , &d , &r);
l++ , u++ , r++ , d++;
long long sum = getSum(d , r);
sum -= getSum(u-1 , r);
sum -= getSum(d , l-1);
sum += getSum(u-1 , l-1);
printf("%lld\n" , sum);
}
}
}
return 0;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: