题解报告:poj 1195 Mobile phones(二维BIT裸题)
Description
Write a program, which receives these reports and answers queries about the current total number of active mobile phones in any rectangle-shaped area.
Input

The values will always be in range, so there is no need to check them. In particular, if A is negative, it can be assumed that it will not reduce the square value below zero. The indexing starts at 0, e.g. for a table of size 4 * 4, we have 0 <= X <= 3 and 0 <= Y <= 3.
Table size: 1 * 1 <= S * S <= 1024 * 1024
Cell value V at any time: 0 <= V <= 32767
Update amount: -32768 <= A <= 32767
No of instructions in input: 3 <= U <= 60002
Maximum number of phones in the whole table: M= 2^30
Output
Sample Input
0 4
1 1 2 3
2 0 0 2 2
1 1 1 2
1 1 2 -1
2 1 1 2 3
3
Sample Output
3
4
解题思路:这是一道二维树状数组入门题---单点修改、单点(区间)查询,其思路和一维树状数组非常相似,多加了一个维度而已。下面我们来看看怎么实现这两个基本操作:
将一维数组A[]扩展到二维数组A[][],二维树状数组C[][]来维护矩阵前缀和。
设原始二维数组A[][]={a11,a12,a13,a14,a15,
a21,a22,a23,a24,a25,
a31,a32,a33,a34,a35,
a41,a42,a43,a44,a45,
a51,a52,a53,a54,a55};
那么二维树状数组表示如下:
C[1][]=a1,C[1][]=a1+a1,C[1][]=a1,C[1][]=a1+a1+a1+a1,C[1][]=a15
这是数组A[][]第一行的一维树状数组;
C[][1]=a1+a1,C[][]=a1+a+a+a,C[][]=a+a,C[][]=a+a+a+a+a+a+a+a,C[][]=a+a5
这是数组A[][]第一行和第二行相加后得到的树状数组;
C[3][]=a3,C[3][]=a3+a3,C[3][]=a3,C[3][]=a3+a3+a3+a3,C[3][]=a35
这是数组A[][]第三行的一维树状数组;
C[][]=a+a+a+a,C[][]=a+a+a+a+a+a+a+a,C[][]=a+a+a+a...
这是数组A[][]前4行相加后得到的树状数组;
C[5][]=a5,C[5][]=a5+a5,C[5][]=a5,C[5][]=a5+a5+a5+a5,C[5][]=a55
这是数组A[][]第5行的一维树状数组。
仔细观察以上式子可以发现,二维树状数组C[x][y]的值其实是分别在x、y上的一维树状数组向下、向右(x上+lowbit(x)跳跃(>n停止),y上+lowbit(y)跳跃(>n停止))进行求和,这就是矩阵中坐标点值的单点修改。对于区间查询,同样分别在x、y上的一维树状数组从下往上,从右往左进行累加(y上-lowbit(y)跳跃(<=0停止),x上-lowbit(x)跳跃(<=0停止)),这样就得到了(1,1)到(x,y)矩阵中所有元素的和。
回到本题,题意为给出一些命令进行一些操作:
0 S 初始化一个全0的S*S矩阵,这个命令只会在第一次给出一次;
1 X Y A 给坐标点(X,Y)的值加上A;
2 L B R T 询问(L,B)到(R,T)构成的矩阵中所有元素的总和;
3 结束对矩阵的操作,程序终止。
典型的二维BIT,套一下模板即可,但需要注意一点:给出命令中的坐标都是默认从下标0开始的,为避免陷入死循环和计算错误,在更新和询问操作上统一对每一个坐标点(横、纵坐标)加1。
怎么统计坐标点(L,B)到(R,T)矩阵内所有值呢?给出下面的矩阵:
1 2 3 4 5
1 0 0 0 0 0
2 0 0 0 0 0
3 0 0 0
4 0 0 0
5 0 0 0 0
从图上可得计算公式:[R,T]-[L-1,T]-[R,B-1]+[L-1,B-1](多减去了一个左上角的矩阵,还要把它加回来),这样就得到了点(L,B)到(R,T)矩阵中所有元素的和。
AC代码:
#include<cstdio>
#include<string.h>
const int maxn=;
int op,s,x,y,a,l,b,r,t,C[maxn][maxn];
void add(int x,int y,int val){//单点修改
for(int i=x;i<=s;i+=i&-i)
for(int j=y;j<=s;j+=j&-j)
C[i][j]+=val;
}
int query(int x,int y){//前缀和查询
int ans=;
for(int i=x;i>;i-=i&-i)
for(int j=y;j>;j-=j&-j)
ans+=C[i][j];
return ans;
}
int main(){
while(~scanf("%d%d",&op,&s)){
memset(C,,sizeof(C));
while(~scanf("%d",&op)&&op!=){
if(op==){
scanf("%d%d%d",&x,&y,&a);
x++,y++;add(x,y,a);//单点修改
}
else{
scanf("%d%d%d%d",&l,&b,&r,&t);l++,b++,r++,t++;
printf("%d\n",query(r,t)-query(l-,t)-query(r,b-)+query(l-,b-));//区间查询,求矩形中所有元素的和
}
}
}
return ;
}
题解报告:poj 1195 Mobile phones(二维BIT裸题)的更多相关文章
- poj 1195 Mobile phones(二维树状数组)
树状数组支持两种操作: Add(x, d)操作: 让a[x]增加d. Query(L,R): 计算 a[L]+a[L+1]……a[R]. 当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一 ...
- poj 1195:Mobile phones(二维树状数组,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14489 Accepted: 6735 De ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
- (简单) POJ 1195 Mobile phones,二维树状数组。
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- POJ 1195 Mobile phones(二维树状数组)
Mobile phones Time Limit: 5000MS Mem ...
- POJ 1195 Mobile phones (二维树状数组)
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- POJ 1195:Mobile phones 二维树状数组
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 16893 Accepted: 7789 De ...
- POJ 1195 Mobile phones【二维树状数组】
<题目链接> 题目大意: 一个由数字构成的大矩阵,开始是全0,能进行两种操作1) 对矩阵里的某个数加上一个整数(可正可负)2) 查询某个子矩阵里所有数字的和要求对每次查询,输出结果 解题分 ...
- POJ 1195 Mobile phones【 二维树状数组 】
题意:基础的二维数组,注意 0 + lowbit(0)会陷入无限循环----- 之前做一道一维的一直tle,就是因为这个-------------------------- #include<i ...
随机推荐
- ubuntu12.04安装搜狗输入法记录
http://blog.sina.com.cn/s/blog_66fa66650101akip.html 看了http://www.cnblogs.com/A-Song/archive/2013/04 ...
- FPGA第一篇:SRAM工作原理
一.SRAM概述 SRAM主要用于二级快速缓存(Level2 C ache). 它利用晶体管来存储数据.与DRAM相比,SRAM的速度快,但在同样面积中SRAM的容量要比其它类型的内存小. 大部分FP ...
- Qt Quick 图像处理实例之美图秀秀(附源代码下载)
在<Qt Quick 之 QML 与 C++ 混合编程具体解释>一文中我们解说了 QML 与 C++ 混合编程的方方面面的内容,这次我们通过一个图像处理应用.再来看一下 QML 与 C++ ...
- Android耳机线控具体解释,蓝牙耳机button监听(仿酷狗线控效果)
转载请注明出处:http://blog.csdn.net/fengyuzhengfan/article/details/46461253 当耳机的媒体按键被单击后.Android系统会发出一个广播.该 ...
- 2016/05/19 thinkphp 3.2.2 文件上传
显示效果: 多文件上传. 这里是两个文件一起上传 上传到文件夹的效果: ①aa为调用Home下common文件夹下的function.php 中的rname方法 实现的 ②cc为调用与Home ...
- Django模板语言(二)
1,装饰器:在不改变原函数的调用方式情况下为原函数增加一些功能(遵循开放封闭的原则) def outter(fn): def inner(*args, **kwargs): # 可以在执行函数前执行一 ...
- XMU 1613 刘备闯三国之三顾茅庐(一) 【并查集】
1613: 刘备闯三国之三顾茅庐(一) Time Limit: 1000 MS Memory Limit: 128 MBSubmit: 99 Solved: 29[Submit][Status][ ...
- javaScript改变HTML
改变HTML输出流: 在JavaScript中,document.write() 可用于直接向HTML输出流写内容 <!DOCTYPE html> <html> <bod ...
- Facebook Flux 分析
首先是actions使用了Dispatcher来定义分发事件, Store在Dispatcher里注册自己的ActionType,收到对应的Action后修改Store内部的结构 Store emit ...
- 并不对劲的字符串专题(三):Trie树
据说这些并不对劲的内容是<信息学奥赛一本通提高篇>的配套练习. 并不会讲Trie树. 1.poj1056-> 模板题. 2.bzoj1212-> 设dp[i]表示T长度为i的前 ...