poj 1195 Mobile phones 解题报告
题目链接:http://poj.org/problem?id=1195
题目意思:有一部 mobie phone 基站,它的面积被分成一个个小正方形(1 * 1 的大小),所有的小正方形的面积构成了一个 S * S 大小的矩阵(下标都是从 0 ~ S-1 变化的)。
有四种指令:
第 一 行的指令默认输入是 0, 空格之后是矩阵的大小: S
最后一行的指令是 3, 代表 整个输入结束
注意:这两行的指令只会出现一次!
夹在它们中间的指令有可能是指令1,假设为X Y A,代表向第 X 行 第 Y 列的那个小正方形加上A (可正可负),不需要输出结果。 又或者是指令2,假设为 L B R T,代表要计算出 行 L ~ R,列 B ~ T 所围住的矩形的和,这个指令要求输出这个和。
看了很久,终于看明白题目了,表示英文太差,经常看不懂POJ 的英文题 = =。
二维树状数组,有了前一天二维树状数组探索版的积累,套了下模板。不过询问那里,也就是指令 2 的输出有点问题,今天终于改好了,happy ^_^ ....
首先要知道二维树状数组这个模板的 Sum 究竟算出来的是什么:假如调用的是Sum(i, j)啦,那么它求出的是从最左上角的坐标到坐标 (i, j) 所围的面积的和!!! 那么如果要求特定的某个子矩阵的面积(例如 (2, 3) ~ (3,4)),就需要减去相应不需要的部分啦。

数字4 是我们要求的部分,如果单纯调用Sum(3, 4) 的话,得出的是编号 1 的和,那么我们需要减去2和3的和,才能得出4的和,而要得出2的和,也需要减去[A11 + A12]这个矩阵的和啦,也就是Sum(3, 2) - Sum(1, 2),对应代码中的 Sum(R+1, B)-Sum(L, B)。而编号 3 的和对应代码: Sum(L, T+1)。
(之前错误地写成Sum(3, 4)- Sum(2, 3) 了, = =,粗心呀~~~,读者请忽略)
还有一个值得注意的地方是,树状数组下标是从1开始的,而题目坐标是从0开始的,所以不妨相应地向右下角移动一位,就是说,假设输入的是0 0,那么就看成是1 1 (这个是受hdu 1541 的 Stars 启发啦)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; const int maxn = + ;
int A[maxn][maxn];
int C[maxn][maxn];
int size; int lowbit(int x)
{
return x & (-x);
} int Sum(int i, int j)
{
int result = ;
for (int x = i; x > ; x -= lowbit(x))
{
for (int y = j; y > ; y -= lowbit(y))
result += C[x][y];
}
return result;
} void Modify(int i, int j, int delta)
{
A[i][j] += delta; for (int x = i; x < size+; x += lowbit(x))
{
for (int y = j; y < size+; y += lowbit(y))
C[x][y] += delta;
}
} int main()
{
int x, y, ask, num, L, B, R, T;
memset(A, , sizeof(A));
memset(C, , sizeof(C));
while (scanf("%d", &ask) != EOF && ask != )
{
if (ask == )
scanf("%d", &size);
else if (ask == )
{
scanf("%d%d%d", &x, &y, &num);
Modify(x+, y+, num);
}
else if (ask == )
{
scanf("%d%d%d%d", &L, &B, &R, &T);
printf("%d\n", Sum(R+, T+)-(Sum(R+, B)-Sum(L, B))- Sum(L, T+)); // 对应图中的1-2-3
}
}
return ;
}
poj 1195 Mobile phones 解题报告的更多相关文章
- 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(二维BIT裸题)
Description Suppose that the fourth generation mobile phone base stations in the Tampere area operat ...
- (简单) 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(二维树状数组)
树状数组支持两种操作: Add(x, d)操作: 让a[x]增加d. Query(L,R): 计算 a[L]+a[L+1]……a[R]. 当要频繁的对数组元素进行修改,同时又要频繁的查询数组内任一 ...
- ●POJ 1195 Mobile phones
题链: http://poj.org/problem?id=1195 题解: 二维树状数组 #include<cstdio> #include<cstring> #includ ...
- POJ 1195 Mobile phones【二维树状数组】
<题目链接> 题目大意: 一个由数字构成的大矩阵,开始是全0,能进行两种操作1) 对矩阵里的某个数加上一个整数(可正可负)2) 查询某个子矩阵里所有数字的和要求对每次查询,输出结果 解题分 ...
随机推荐
- 洛谷 [P1939] 矩阵加速数列
矩阵快速幂模版 #include <iostream> #include <cstring> #include <cstdlib> #include <alg ...
- Codeforces Round #287 (Div. 2) D. The Maths Lecture [数位dp]
传送门 D. The Maths Lecture time limit per test 1 second memory limit per test 256 megabytes input stan ...
- MongoDB数据关系的表达
虽说MongoDB是非关系型数据库,但由于大部分情况下数据之间是存在关系的,所以MongoDB也需要一些方式来表达数据之间的关系.MongoDB表达数据关系的方式有两种:文档嵌套和数据库引用. 一.文 ...
- windows安装SUSE Linux Enterprise Server 12
一:打开“开发人员模式” 点击开始菜单按钮,选择“设置” 在设置中选择“更新和安全” 在菜单中选择“针对开发人员”,在三个选项中,选中“开发人员模式” 在弹出的警告框中点击“是” 这样开发人员模式就打 ...
- Peter Norvig:十年学会编程
为啥都想速成? 随便逛一下书店,你会看到<7天自学Java>等诸如此类的N天甚至N小时学习Visual Basic.Windows.Internet的书.我用亚马逊网站的搜索功能,出版年份 ...
- Hive入门及常用指令
基础命令show databases; # 查看某个数据库use 数据库; # 进入某个数据库show tables; # 展示所有表desc 表名; # 显示表结构show partitions 表 ...
- excel转换html
利用POI解析excel,转换成html,支持各种版本的excel.支持自定义样式.支持行列合并 需要用到的jar public class Excel2Html { /** * 读取Excel并转换 ...
- 自主学习Flappy Bird游戏
背景 强化学习 MDP基本元素 这部分比较难懂,没有详细看:最优函数值,最优控制等 Q-learning 神经网络 环境搭建 windows下通过pip安装TensorFlow,opencv-pyth ...
- 源码编译安装php
原文:https://klionsec.github.io/2017/11/23/phpsec/#menu After compile install php 5.3.1, I can not fin ...
- SolidEdge如何绘制变化半径倒圆角
1 在要变化半径的边上打一些点 2 点击倒角命令的参数对话框,选择可变半径 3 选择倒角的直线,右击确认,再依次点击关键点,修改倒角数值,修改之后按回车,继续下一个点,直到结束.