Description

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

Input

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

Output

一行,输出最小的L值。

Sample Input

4
0 1
0 -1
1 0
-1 0

Sample Output

1

HINT

首先可以确定此题满足可二分性,明显可以二分答案。所以我们只要能够在线性时间内检验即可了。

线性检测我们可以贪心解决,我们将每次还未被覆盖的点用一个最小的矩形来覆盖,然后每次选择用正方形覆盖它的四个角,总共递归三层,64种情况。所以我们枚举这64种情况,看是否能有一种能够覆盖所有的点。

这个贪心我开始没想到,现在也不会证明(理性想想是对的),我开始想的取左下角的点(x优先)为正方形左下角wa了,然后左下角的点(y优先)为正方形左下角wa了,再最左最下的两条平行坐标轴线的交点为正方形左下角还是wa了。最后将三者综合起来,还是wa了,但是正确率高了一些。这启发我以后贪心可以综合起来,取最优解正确率会高很多。

 #include<vector>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std; #define inf (1<<29)
#define maxn 20010
int n,x[maxn],y[maxn]; bool exist[maxn]; inline bool dfs(int L,int step,int all)
{
if (all == n) return true;
if (step > ) return false;
int up = -inf,down = inf,le = inf,ri = -inf;
for (int i = ;i <= n;++i)
if (!exist[i])
{
up = max(y[i],up),down = min(y[i],down);
ri = max(x[i],ri),le = min(x[i],le);
}
int inc,nl,nr,nu,nd; vector <int> vec;
inc = ; nl = le,nr = le+L,nu = up,nd = up-L;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = le,nr = le+L,nu = down+L,nd = down;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = ri-L,nr = ri,nu = up,nd = up-L;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
inc = ; nl = ri-L,nr = ri,nu = down+L,nd = down;
for (int i = ;i <= n;++i)
if (!exist[i] && x[i] >= nl&&x[i] <= nr&&y[i] >= nd&&y[i] <= nu)
++inc,exist[i] = true,vec.push_back(i);
if (dfs(L,step+,all+inc)) return true;
for (int i = ;i < vec.size();++i) exist[vec[i]] = false; vec.clear();
return false;
} inline bool okay(int L)
{
memset(exist,false,n+);
return dfs(L,,);
} int main()
{
freopen("1052.in","r",stdin);
freopen("1052.out","w",stdout);
scanf("%d",&n); for (int i = ;i <= n;++i) scanf("%d %d",&x[i],&y[i]);
if (okay()) printf(""),exit();
int l = ,r = inf,mid;
while (l <= r)
{
mid = (l + r) >> ;
if (okay(mid)) r = mid - ;
else l = mid + ;
}
printf("%d",l);
fclose(stdin); fclose(stdout);
return ;
}

BZOJ 1052 覆盖问题的更多相关文章

  1. [BZOJ]1052 覆盖问题(HAOI2007)

    三矩形覆盖问题啊……不过听说FJOI还出过双圆覆盖问题? Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来, ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. bzoj 1052 dfs

    首先可以二分答案,将最优性问题转化为判定性问题. 对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,3个正方形,第一个肯定放在这个矩形其中的一角,然后 ...

随机推荐

  1. 全栈project师?给把瑞士军刀你去砍鬼子好不好!?

    来自www.techgogogo.com 编者注:本文来自Medium前三名推荐文章,发文时已经获得高达2,125个推荐,中文版由天地会珠海分舵编译.全文对当今风靡业界的"全栈xx师&quo ...

  2. C# 之 System.Object

    System.Object     C#中全部的类都直接或间接继承自System.Object类,这使得C#中的类得以单根继承.假设我们没有明白指定继承类,编译器缺省觉得该类继承自System.Obj ...

  3. bootstrapUI

    http://www.tinygroup.org/tinyadmin/#ajax/dashboard.pagelet

  4. git学习 #2:git基本操作

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  5. 字符串 赋值 以及gets

    我们知道字符串用字符数组或用指针实现,但是在赋值的时候产生了不少疑惑 使用方法一: char a[ ]={"I LOVE YOU!"}; 但是以下这样就是错的: char a[20 ...

  6. css 权威指南笔记(四)选择器

    规则结构 每个规则都有两个基本部分组成:选择器和声明块.声明块由一个或多个声明组成,每个声明则是一个属性-值对. 元素选择器 声明和关键字 关键字一般由空格隔开:有一种情况例外 font属性中的  斜 ...

  7. unity介绍

  8. 利用switch语句进行多选一判断。

    <!doctype html> <meta http-equiv="content-type" content="text/html" cha ...

  9. HTML select 操作

    今天遇到一个问题,就是想设置select的默认选择项.但是试了很多方法都不行: <fieldset data-role="contractstatus"> <la ...

  10. noip 2003 传染病控制(历史遗留问题2333)

    /*codevs 1091 搜索 几个月之前写的70分 今天又写了一遍 并且找到了错误 */ #include<cstdio> #include<vector> #define ...