三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题?

Description

  某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小树遮起来。我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*L的正方形的边要求平行与坐标轴,一个点如果在正方形的边界上,也算作被覆盖。当然,我们希望塑料薄膜面积越小越好,即求L最小值。

Input

  第一行有一个正整数N,表示有多少棵树。接下来有N行,第i+1行有2个整数Xi,Yi,表示第i棵树的坐标。

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)的更多相关文章

  1. BZOJ 1052 覆盖问题

    Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小 ...

  2. 【BZOJ】【1052】【HAOI2007】覆盖问题

    二分+贪心 首先二分L,转化成判定问题…… 但是判定不会判啊QAQ orz hzwer,用一个最小的矩形框住所有点后,直接往矩形的角上摆正方形……第二个用同样的方法摆,最后判一下剩下的能否被完全覆盖 ...

  3. BZOJ 1052: [HAOI2007]覆盖问题

    BZOJ 1052: [HAOI2007]覆盖问题 题意:给定平面上横纵坐标在-1e9~1e9内的20000个整数点的坐标,用三个大小相同边平行于坐标轴的正方形覆盖(在边界上的也算),问正方形的边长最 ...

  4. 二分判定 覆盖问题 BZOJ 1052

    //二分判定 覆盖问题 BZOJ 1052 // 首先确定一个最小矩阵包围所有点,则最优正方形的一个角一定与矩形一个角重合. // 然后枚举每个角,再解决子问题 #include <bits/s ...

  5. 【BZOJ 1052】 1052: [HAOI2007]覆盖问题 (乱搞)

    1052: [HAOI2007]覆盖问题 Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的 ...

  6. AC日记——[HAOI2007]覆盖问题 bzoj 1052

    1052 思路: 二分答案: 二分可能的长度: 然后递归判断长度是否可行: 先求出刚好覆盖所有点的矩形: 可行的第一个正方形在矩形的一个角上: 枚举四个角上的正方形,然后删去点: 删去一个正方形后,递 ...

  7. [BZOJ 1052][HAOI2007]覆盖问题(二分答案)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1052 分析: 挺有想法的一道题,先二分答案ans,主要是判断的问题. 首先可以弄出把所 ...

  8. BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS

    标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有 ...

  9. 【以前的空间】bzoj 1052 [HAOI2007]覆盖问题

    这道题的思路挺简单的……就是可以证明如果要覆盖一个区域内的点,那么一定有一个正方形在这“区域内的点所围成的最大矩形的四个角中的一个”(不要吐槽很多的“的”……),对于长度r是否可以覆盖整个区域内的点, ...

随机推荐

  1. Python split()方法

    Python split()方法 描述 Python split()通过指定分隔符对字符串进行切片,如果参数num 有指定值,则仅分隔 num 个子字符串 语法 split()方法语法: str.sp ...

  2. python3变量和数据类型

        变量和数据类型 知识点 python 关键字 变量的定义与赋值 input() 函数 字符串的格式化 实验步骤 每一种编程语言都有它们自己的语法规则,就像我们所说的外语. 1. 关键字和标识符 ...

  3. Error contacting service. It is probably not running.

    平台:centos-6.3-i386 jdk-7u51 storm 0.9.1 python 2.6.6   hadoop 1.2.1 运行zookeeperd后显示启动成功: JMX enabled ...

  4. SQL之Left Join 关联条件的探讨

    在测试工作中,有时需要测试数据库数据经过sql计算后的结果是否满足某一功能查询得到的返回值. 针对某些需要功能需要联查多张表,此时 关联 的作用就异常重要了,而针对多表关联,其中 关联条件的重要性不言 ...

  5. php_类的定义

    此文章为原创见解,例子各方面也是东拼西凑.如果有错请留言.谢谢 在面向对象的思维中提出了两个概念,类和对象. 类是对某一类实物的抽象描述,而对象用于表示现实中该类事物的个体, 例子:老虎是父类,东北虎 ...

  6. 3-51单片机WIFI学习(开发板8266底层源码介绍)

    上一篇链接  http://www.cnblogs.com/yangfengwu/p/8743502.html 直接上源码:注意源码有两部分,第一部分是一开始的时候写在模块内部的,另一部分是存在手机内 ...

  7. MQTT和paho(一)

    参考链接:http://blog.csdn.net/yangzl2008/article/details/8861069 一.mqtt 1.简单介绍 http://mqtt.org/software ...

  8. Spring Security入门(2-1)Spring Security - 重要的过滤器

    1.自定义的filter机制 如果要对Web资源进行保护,最好的办法莫过于Filter,要想对方法调用进行保护,最好的办法莫过于AOP. Acegi对Web资源的保护,就是靠Filter实现的.Ace ...

  9. js常用的数组方法

    1.创建数组的基本方法:  1.1 空数组  var obj=new Array();                 1.2 指定长度数组  var obj=new Array(size);     ...

  10. Python基础(函数-递归)

    本章内容: 深浅拷贝 函数(全局与局部变量) 内置函数 文件处理 三元运算 lambda 表达式 递归(斐波那契数列) 冒泡排序 深浅拷贝 一.数字和字符串 对于 数字 和 字符串 而言,赋值.浅拷贝 ...