三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题?
Description
Input
Output
一行,输出最小的L值。
Sample Input
4
0 1
0 -1
1 0
-1 0
Sample Output
1
HINT
1 <= N <= 20000,坐标绝对值 <= 10^9,保证不会有2棵树的坐标相同。
Solution
三正方形有些复杂,我们不如先从单正方形,双正方形入手。单正方形的答案就是max(横坐标极差,纵坐标极差)。
双正方形不好贪心,所以我们二分一下答案,判断两个正方形能否覆盖所有点。
我们就思考一下,这两个正方形放在哪里,才能尽量覆盖所有点。
发现覆盖的形式不外乎两种情况,一种是 一个在左上一个在右下 ,另一种是 一个在右上一个在左下。
假设是 一个在左上一个在右下 的情况,处于左上方的正方形一定要盖住横坐标最左的和纵坐标最上的点,因为另一个正方形不会帮你干这件事。
同理,处于右下方的正方形也一样。
所以,两个正方形放置的位置也就确定了,剩下的事情就是O(n)扫一遍判断是否在正方形内了。
那么三正方形其实也是极其类似的做法。
还是二分答案,考虑三个正方形的放法,发现情况有一点多。
但是有一点一定是不变的,那就是必定有一个正方形,处于左上、右上、左下、右下的其中一个角!
那么我们就枚举这个角,删去这个角内的点,剩下的,就是一个双正方形覆盖问题!
时间复杂度O(nlogn)。
#include <cstdio>
#include <algorithm>
#include <cstring>
#define MN 20005
#define INF 0x3FFFFFFF
using namespace std;
struct node{int x,y;}a[MN];
int b[MN];
int bin,n,L,R; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} bool cov(int len)
{
if (!bin) return true;
register int i,lm,rm,dm,um;
lm=dm=INF; rm=um=-INF;
for (i=;i<=bin;++i)
lm=min(lm,a[b[i]].x),rm=max(rm,a[b[i]].x),
dm=min(dm,a[b[i]].y),um=max(um,a[b[i]].y);
for (i=;i<=bin;++i)
if (!(a[b[i]].x<=lm+len&&a[b[i]].y<=dm+len
||a[b[i]].x>=rm-len&&a[b[i]].y>=um-len)) break;
if (i>bin) return true;
for (i=;i<=bin;++i)
if (!(a[b[i]].x<=lm+len&&a[b[i]].y>=um-len
||a[b[i]].x>=rm-len&&a[b[i]].y<=dm+len)) break;
if (i>bin) return true;
return false;
} void del(int lm,int dm,int rm,int um)
{
register int i;
for (bin=,i=;i<=n;++i)
if (a[i].x<lm||a[i].x>rm||a[i].y<dm||a[i].y>um) b[++bin]=i;
} int main()
{
register int i,lm,rm,dm,um;
lm=dm=INF; rm=um=-INF;
n=read();
for (i=;i<=n;++i)
a[i].x=read(),a[i].y=read(),
lm=min(lm,a[i].x),rm=max(rm,a[i].x),
dm=min(dm,a[i].y),um=max(um,a[i].y);
L=; R=max(um-dm,rm-lm);
while (L<R)
{
int mid=L+R>>;
for (i=;i<=;++i)
{
if (i==) del(lm,dm,lm+mid,dm+mid);
else if (i==) del(lm,um-mid,lm+mid,um);
else if (i==) del(rm-mid,dm,rm,dm+mid);
else if (i==) del(rm-mid,um-mid,rm,um);
if (cov(mid)) break;
}
if (i<=) R=mid; else L=mid+;
}
printf("%d",L);
}
Last Word
没有想到小C能抢到这题的一个rank1,先放张图留念,指不定哪天就被某大神艹下去了。
[BZOJ]1052 覆盖问题(HAOI2007)的更多相关文章
-
BZOJ 1052 覆盖问题
Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...
-
【BZOJ】【1052】【HAOI2007】覆盖问题
二分+贪心 首先二分L,转化成判定问题…… 但是判定不会判啊QAQ orz hzwer,用一个最小的矩形框住所有点后,直接往矩形的角上摆正方形……第二个用同样的方法摆,最后判一下剩下的能否被完全覆盖 ...
-
BZOJ 1052: [HAOI2007]覆盖问题
BZOJ 1052: [HAOI2007]覆盖问题 题意:给定平面上横纵坐标在-1e9~1e9内的20000个整数点的坐标,用三个大小相同边平行于坐标轴的正方形覆盖(在边界上的也算),问正方形的边长最 ...
-
二分判定 覆盖问题 BZOJ 1052
//二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ...
-
【BZOJ 1052】 1052: [HAOI2007]覆盖问题 (乱搞)
1052: [HAOI2007]覆盖问题 Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的 ...
-
AC日记——[HAOI2007]覆盖问题 bzoj 1052
1052 思路: 二分答案: 二分可能的长度: 然后递归判断长度是否可行: 先求出刚好覆盖所有点的矩形: 可行的第一个正方形在矩形的一个角上: 枚举四个角上的正方形,然后删去点: 删去一个正方形后,递 ...
-
[BZOJ 1052][HAOI2007]覆盖问题(二分答案)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1052 分析: 挺有想法的一道题,先二分答案ans,主要是判断的问题. 首先可以弄出把所 ...
-
BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS
标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...
-
【以前的空间】bzoj 1052 [HAOI2007]覆盖问题
这道题的思路挺简单的……就是可以证明如果要覆盖一个区域内的点,那么一定有一个正方形在这“区域内的点所围成的最大矩形的四个角中的一个”(不要吐槽很多的“的”……),对于长度r是否可以覆盖整个区域内的点, ...
随机推荐
-
Myeclispe 安装 SVN :
Myeclispe 安装 SVN :解压 : site-1.8.22.zip 放入如下路径下即可 :
-
C# 与 Java 中的枚举
C#代码: 利用扩展方法,扩展枚举功能 using System; using System.Collections.Generic; using System.Text; using System. ...
-
C#导出Excel那些事
Excel导出 Excel导出的意义 因为在项目中有些报表数据客户需要导出功能,那么导出为Excel就十分有必要了,可是有些客户的机器上并没有安装Excel或者安装的版本参差不一.那么我们在这样的情况 ...
-
CenOS 7 安装mysql
1:安装YUM源 2:利用file zilla 将mysql文件拖放到 /var/opt 目录下 3:在centos当中,已经将mysql的文件放到了 /var/opt 我们只需要安装就可以 安装 ...
-
symbol(s) not found for architecture x86_64
项目报错如下: ld: warning: ignoring file /xxxx/xxxx/ZBarSDK/libzbar.a ld: symbol(s) not found for architec ...
-
java守护线程(后台线程)
/*1.让各个对象或类相互灵活交流2.两个线程都冻结了,就不能唤醒了,因为根据代码要一个线程活着才能执行唤醒操作,就像玩木游戏3.中断状态就是冻结状态4.当主线程退出的时候,里面的两个线程都处于冻结状 ...
-
NGINX和PHP之间的环境变量传递
昨天遇到的,想将IP访问转换成域名访问.则NGINX需要将相关的变量转换后传递给PHP. 网上有一系统的方法: 前面讲过该不该把信息写在服务器配置文件里?.通过php扩展hidef来define常量, ...
-
hdu 3001 Travelling (TSP问题 )
Travelling Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
-
ABP官方文档翻译 6.3 本地化
本地化 介绍 应用程序语言 本地化源 XML文件 注册XML本地化源 JSON文件 注册JSON本地化源 资源文件 自定义源 当前语言是如何决定的 ASP.NET Core ASP.NET MVC 5 ...
-
JAVA_SE基础——48.多态
面向对象程序设计的三个特点是封装.继承和多态.前面已经学习了前两个特点.本章节将介绍多态性. 多态:一个对象具备多种形态.(父类的引用类型变量指向了子类的对象)或者是接口 的引用类型变量指向了接口实现 ...