1052: [HAOI2007]覆盖问题

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2446  Solved: 1131
[Submit][Status][Discuss]

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

100%的数据,N<=20000

/*
二分答案后怎么覆盖呢
容易想到找最左上角,左下角,右上角,右下角的点搞一搞
就是说先得找个最小矩形把所有点覆盖起来。
然后怎么用三个正方形覆盖所有点呢?
显然必须满足覆盖最外边的点,因此就是要从大矩形四个角入手。
先找一个角放上一个,最优解一定有这个。
然后把它覆盖的点删去,就成了一个子问题。更新大矩形,再放一个。
判断最后剩下的点能不能用最后一个正方形 覆盖即可。
O(nlogn)
*/
#include<bits/stdc++.h> #define inf 1000000001
#define ll long long
#define N 20007 using namespace std;
int n,ans,mid;
struct node{
int x[N],y[N],rest;
}a,b; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void cut(node &a,int x1,int y1,int x2,int y2)//删点
{
int tot=;
for(int i=;i<=a.rest;i++)
if(a.x[i]<x1||a.x[i]>x2||a.y[i]<y1||a.y[i]>y2)
{
tot++;
a.x[tot]=a.x[i];
a.y[tot]=a.y[i];
}
a.rest=tot;
} void solve(node &a,int opt)//放两个正方形
{
int x1=inf,y1=inf,x2=-inf,y2=-inf;
for(int i=;i<=a.rest;i++)
{
x1=min(a.x[i],x1),x2=max(a.x[i],x2);
y1=min(a.y[i],y1),y2=max(a.y[i],y2);
}
if(opt==) cut(a,x1,y1,x1+mid,y1+mid);
if(opt==) cut(a,x2-mid,y1,x2,y1+mid);
if(opt==) cut(a,x1,y2-mid,x1+mid,y2);
if(opt==) cut(a,x2-mid,y2-mid,x2,y2);
} bool judge()
{
node b;
for(int x=;x<=;x++)
for(int y=;y<=;y++)
{
b.rest=a.rest;
for(int i=;i<=b.rest;i++)
b.x[i]=a.x[i],b.y[i]=a.y[i];
solve(b,x);solve(b,y);
int x1=inf,y1=inf,x2=-inf,y2=-inf;
for(int i=;i<=b.rest;i++)
{
x1=min(b.x[i],x1),x2=max(b.x[i],x2);
y1=min(b.y[i],y1),y2=max(b.y[i],y2);
}
if(x2-x1<=mid&&y2-y1<=mid)return ;//最后一个可以盖住
}
return ;
} int main()
{
n=read();a.rest=n;
for(int i=;i<=a.rest;i++)
a.x[i]=read(),a.y[i]=read();
int l=,r=inf;
while(l<=r)
{
mid=(l+r)>>;
if(judge()) ans=mid,r=mid-;
else l=mid+;
}
printf("%d\n",ans);
return ;
}

bzoj1052覆盖问题(二分+贪心)的更多相关文章

  1. [BZOJ1052][HAOI2007]覆盖问题 二分+贪心

    1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 2053  Solved: 959 [Submit][Sta ...

  2. 【BZOJ1052】覆盖问题(贪心)

    [BZOJ1052]覆盖问题(贪心) 题面 BZOJ 洛谷 题解 这题好神仙啊. 很明显可以看出来要二分一个边长. 那么如何\(check\)呢? 我们把所有点用一个最小矩形覆盖, 那么必定每个边界上 ...

  3. $bzoj2067\ szn$ 二分+贪心

    正解:二分+贪心 解题报告: 传送门$QwQ$ 题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长. 昂首先最少用多少条线这个还是蛮$e ...

  4. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  5. 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心

    /** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...

  6. 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心

    题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...

  7. Codeforces_732D_(二分贪心)

    D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...

  8. CF732D Exams 二分 贪心

    思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...

  9. $CF949D\ Curfew$ 二分/贪心

    正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...

随机推荐

  1. js变量类型详解

    <html> <title>js变量类型详解</title> <meta http-equiv="content-type" conten ...

  2. Java Class 利用classpath来获取源文件地址

    利用classpath来获取源文件地址 @author ixenos 应用场景 Properties props = new Properties(); /** * . 代表java命令运行的目录 * ...

  3. 删除右键open foler as pycharm project(WIN10)

    1.打开注册表(WIN+R 输入regedit) 2.找到 HKEY_CLASSES_ROOT\Directory\Background 路径 下找到Parcharm文件夹,删除,右键的open fo ...

  4. msp430入门编程0

    msp430单片机最小系统 msp430入门学习 msp430入门编程

  5. 转 POJ分类

    OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...

  6. SOJ 3300_Stockholm Coins

    [题意]给n个数,求一个数,使这个数能且只能由(n个数每个至少出现一次)表示.输出满足条件的最小的数. [分析](完全背包)如果有满足条件的最小的数,那么这个数只能是这n个数的和total,通过记录每 ...

  7. 【小记事】电脑命令行开WiFi

    1.设置WiFi名称和密码 在命令行输入: netsh wlan set hostednetwork mode=allow WiFi名称 key=密码 2.开启WiFi 在命令行输入: netsh w ...

  8. hihocoder1496(高维前缀和)

    题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N( ...

  9. 查找olr备份路径

    使用:ocrdump -local <olr_dump_name> more <olr_dump_name> 来查找 [SYSTEM.OLR.BACKUP.LOC] 的相应键值 ...

  10. 两个月后才更新一篇。。。。LIB和DLL的差别

     共同拥有两种库: 一种是LIB包括了函数所在的DLL文件和文件里函数位置的信息(入口).代码由执行时载入在进程空间中的DLL提供,称为动态链接库dynamic link library. 一种是 ...