BZOJ 4302 Buildings 解题报告
这个题好像很有趣的样子。
题目分析:
- 房间都是 $1\times k$ 的,也就是一条一条的。这个好像比较显然的样子。
- 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Boundry)$,即其到边界的距离,这个好像也比较显然的样子。
- 于是答案至少是 $max\{dis(u, Boundry)\}$,然后可以通过构造来取到最小值,即答案就是$max\{dis(u, Boundry)\}$。
算法流程:
- 特判:如果输入的是一个边长为一个奇数的正方形,且 $(x,y)$ 恰好是正方形的中心,那么答案为 $\frac{n-1}{2}$。
- 初始化:因为答案至少是 $\lfloor\frac{min(n,m)+1}{2}\rfloor$(考虑最中心的格子),故令答案初始化为这个东西。
- 更新答案:然后我们只需要找 $(x,y)$ 旁边的四个格子,计算其到边界的距离,然后和初始答案取最大值就是最终答案了。
一些细节:
- 枚举 $(x,y)$ 的相邻的格子的时候,要注意一下这个格子是否合法。
- 怎么计算 $dis(u, Boundry)$ 呢?直接枚举拓展的方向,看要走多少步才能到达边界,取其最小步数。
- 计算距离的时候要注意只能从三个方向拓展,有一个方向会经过 $(x,y)$,是走不动的。
时间复杂度:$O(T)$,空间复杂度:$O(1)$。
#include <cstdio>
#include <algorithm>
using namespace std; const int Fx[][] = {{, }, {-, }, {, }, {, -}};
int n, m, x, y; inline int Calc(int tx, int ty, int k)
{
int Min = min(n, m);
for (int i = ; i < ; i ++)
{
if (k == i) continue ;
if (i == ) Min = min(Min, n + - tx);
if (i == ) Min = min(Min, tx);
if (i == ) Min = min(Min, m + - ty);
if (i == ) Min = min(Min, ty);
}
return Min;
} inline int Solve()
{
if (n == m && (n & ) && x == y && (x * - == n))
return n - >> ;
int ans = min(n, m) + >> ;
for (int k = ; k < ; k ++)
{
int tx = x + Fx[k][], ty = y + Fx[k][];
if (tx && ty && tx <= n && ty <= m)
ans = max(ans, Calc(tx, ty, k ^ ));
}
return ans;
} int main()
{
while (scanf("%d%d%d%d", &n, &m, &x, &y) == )
printf("%d\n", Solve()); return ;
}
4302_Gromah
BZOJ 4302 Buildings 解题报告的更多相关文章
- BZOJ 2959: 长跑 解题报告
2959: 长跑 Description 某校开展了同学们喜闻乐见的阳光长跑活动.为了能"为祖国健康工作五十年",同学们纷纷离开寝室,离开教室,离开实验室,到操场参加3000米长跑 ...
- BZOJ 4238 电压 解题报告
BZOJ 4238 电压 考虑一条边成为答案以后,删去Ta后剩下的图是一个或很多个二分图,即没有奇环 则一条边可以成为答案,当且仅当自己在所有奇环的交上且不在偶环上. 考虑建出dfs树,那么返祖边一定 ...
- BZOJ 3159: 决战 解题报告
BZOJ 3159: 决战 1 sec 512MB 题意: 给你一颗\(n\)个点,初始点权为\(0\)的有跟树,要求支持 Increase x y w 将路径\(x\)到\(y\)所有点点权加上\( ...
- BZOJ 3328: PYXFIB 解题报告
BZOJ 3328: PYXFIB 题意 给定\(n,p,k(1\le n\le 10^{18},1\le k\le 20000,1\le p\le 10^9,p \ is \ prime,k|(p- ...
- BZOJ 3160 万径人踪灭 解题报告
这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...
- BZOJ 4127 Abs 解题报告
这个题感觉很厉害的样子.. 首先我们注意到一点:每次加的 $d$ 都是非负的. 那么就说明一个数只可能从负数变成非负数并且只会变一次. 所以我们就可以暴力地去改变一个数的正负情况. 然后我们就可以用树 ...
- BZOJ 3953 Self-Assembly 解题报告
首先,我们可以先考虑一个暴力一点的算法: 对于任意两个分子,如果它们能以至少一种进行匹配,那么我们就在这两个分子之间连一条边. 然后如果我们能找到一个环,就说明是 unbounded,否则就是 bou ...
- BZOJ 3956 Count 解题报告
好点对的个数是\(O(n)\)的,而且我们可以 \(O(n)\) 地求出所有好点对. 我们把这些点对以右端点为关键字从小到大排序,再弄个扫描线,每次把右端点在扫描线上的点对的左端点加入线段树,于是我们 ...
- BZOJ 3944 Sum 解题报告
我们考虑令: \[F_n = \sum_{d|n}\varphi(d)\] 那么,有: \[\sum_{i=1}^{n}F_i = \sum_{i=1}^{n}\sum_{d|i}\varphi(d) ...
随机推荐
- Swift字典
字典初始化 基本语法: [key 1: value 1, key 2: value 2, key 3: value 3] var airports: Dictionary<String ...
- 【学习笔记】【C语言】循环结构-while
1. 简单使用 while ( 条件 ) { 语句1; 语句2; .... } 如果条件成立,就会执行循环体中的语句(“循环体”就是while后面大括号{}中的内容).然后再次 ...
- C# Winform里面用Console.WriteLine输出到哪了
C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...
- 正确的安装和使用nvm
前言 目前主流的node版本管理工具有两种,nvm和n.两者差异挺大的,具体分析可以参考一下淘宝FED团队的一篇文章: 管理 node 版本,选择 nvm 还是 n? 总的来说,nvm有点类似于 Py ...
- ajax学习计划
来自http://segmentfault.com/a/1190000004322487?utm_source=Weibo&utm_medium=shareLink&utm_campa ...
- ios固定高度禁止惯性滚动
最近测试pad改H5的项目时,固定高度的div,超出部分滚动,但在ios下滑动特别卡顿,安卓上没问题.搜索找到解决办法 固定高度的div设置超出页面滚动,ios会出现卡顿,非常不爽.通过下面css就可 ...
- AR模式
AR模式 在ThinkPHP框架中,一共存在两种操作模式:ORM模式与AR模式 ORM模式:① 实例化模型 ② 创建数据对象组装数组 ③ 调用相关方法执行相关操作 AR模式:① 实例化模型 ② 把数据 ...
- 超越luabind的luaBridge
此编是引用他人的文章,这里记录下,主要为以后自己查找方便,原文地址:http://www.cppblog.com/sunicdavy/archive/2013/12/07/204648.html 最近 ...
- java集合学习一
首先看一下java集合的关系图 1.1从全面了解Java的集合关系图.常见集合 list set map等其中我们最常用的 list map 结合.几天说一下常见的map.map在我工作的两年里 ...
- jquery.js有红叉
使用Eclipse 3.7及以上版本时,工程中加入jquery.min.js文件,发现该文件出现错误提示(红×),但使用Eclipse 3.7以前的版本就不会出现这种提示.是因为Eclipse 3.7 ...