1052: [HAOI2007]覆盖问题

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2004  Solved: 937
[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

  

  这道题当时一看还以为是一道几何题,就先放着最后打然后就华丽丽的爆零了。

  最后正解并不是我当初第一反应的几何,但确实是我当时第二反应——二分答案,exciting……

  我们可以通过一个无法用语言描述的证明可知至少有一个正方形是位于最小矩形的一个角上的。因为一共就三个正方形,所以我们dfs每个正方形位于当前最小矩形的四个角的情况就好了,那么时间复杂度就是O(log (2*10^9)*n*64)轻松搞掉。

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#include<vector>
#define N 20005
using namespace std;
int n,xx,nx,xy,ny;
bool fw[N];
struct no
{
int x,y;
}node[N];
bool dfs(long long L,int x,int sum)
{
if(sum==n)return ;
if(x==)
return ;
int xxx=-0x7fffffff,nnx=0x7fffffff,xxy=-0x7fffffff,nny=0x7fffffff;
if(x==)
xxx=xx,nnx=nx,xxy=xy,nny=ny;
else
{
for(int i=;i<=n;i++)
{
if(fw[i])continue;
if(node[i].x>xxx) xxx=node[i].x;
if(node[i].x<nnx) nnx=node[i].x;
if(node[i].y>xxy) xxy=node[i].y;
if(node[i].y<nny) nny=node[i].y;
}
}
bool b[N];
int t=sum;
memcpy(b,fw,sizeof(fw));
for(int i=;i<=n;i++)
{
if(!fw[i]&&node[i].x<=nnx+L&&node[i].y<=nny+L)
fw[i]=,t++;
}
if(dfs(L,x+,t)) return ;
memcpy(fw,b,sizeof(b));
t=sum;
for(int i=;i<=n;i++)
{
if(!fw[i]&&node[i].x<=nnx+L&&node[i].y>=xxy-L)
fw[i]=,t++;
}
if(dfs(L,x+,t)) return ; memcpy(fw,b,sizeof(b));
t=sum;
for(int i=;i<=n;i++)
{
if(!fw[i]&&node[i].x>=xxx-L&&node[i].y<=nny+L)
fw[i]=,t++;
}
if(dfs(L,x+,t)) return ; t=sum;
memcpy(fw,b,sizeof(b));
for(int i=;i<=n;i++)
{
if(!fw[i]&&node[i].x>=xxx-L&&node[i].y>=xxy-L)
fw[i]=,t++;
}
if(dfs(L,x+,t)) return ;
memcpy(fw,b,sizeof(b));
return ;
}
int main()
{
scanf("%d",&n);
xx=-0x7fffffff,nx=0x7fffffff,ny=0x7fffffff,xy=-0x7fffffff;
for(int i=;i<=n;i++)
{
scanf("%d%d",&node[i].x,&node[i].y);
if(node[i].x>xx) xx=node[i].x;
if(node[i].x<nx) nx=node[i].x;
if(node[i].y>xy) xy=node[i].y;
if(node[i].y<ny) ny=node[i].y;
fw[i]=;
}
long long li=,ri=max(xy-ny,xx-nx);
while(li<=ri)
{
long long mid=(li+ri)>>;
memset(fw,,sizeof(fw));
if(dfs(mid,,))ri=mid-;
else li=mid+;
}
printf("%lld\n",ri+);
return ;
}

bzoj1052 9.20考试 第二题 覆盖问题的更多相关文章

  1. 9.18考试 第二题Dinner题解

    当时初步感觉是一个类似动归或者贪心的神题,然而由于本题已经给出顺序,贪心貌似并没有什么道理,所以放弃贪心.然后又由于这是一个环的问题,我想到了“合并石子”那种环转链的思路,然后就是一个O(n^2*m) ...

  2. 2017 五一 清北学堂 Day1模拟考试结题报告

    预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...

  3. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  4. NOIP2005-普及组复赛-第二题-校门外的树

    题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  5. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  6. RHCSA考试真题

    2018年 RHCSA考试真题... ------------ 考前需要做的基础 破解root密码 KVM虚拟机与VM虚拟机 主机名:station.domain1.example.comIP地址:1 ...

  7. 【BZOJ4928】第二题 树hash+倍增

    [BZOJ4928]第二题 Description 对于一棵有根树,定义一个点u的k-子树为u的子树中距离u不超过k的部分. 注意,假如u的子树中不存在距离u为k的点,则u的k-子树是不存在的. 定义 ...

  8. 中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

    期末考试编程题 返回   这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成 ...

  9. Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉

    第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...

随机推荐

  1. WPF 为资源字典 添加事件响应的后台类

    原文:WPF 为资源字典 添加事件响应的后台类 前言,有许多同学在写WPF程序时在资源字典里加入了其它控件,但又想写事件来控制这个控件,但是资源字典没有CS文件,不像窗体XAML还有一个后台的CS文件 ...

  2. 硬盘的结构和介绍,硬盘MBR详细介绍(超详细彩图)

    一.物理结构 1.磁道,扇区,柱面和磁头数 硬盘最基本的组成部分是由坚硬金属材料制成的涂以磁性介质的盘片,不同容量硬盘的盘片数不等.每个盘片有两面,都可记录信息.盘片被分成许多扇形的区域,每个区域叫一 ...

  3. Windows Phone Launcher class

    Starts the default app associated with the specified file or URI. Launch a file contained in the app ...

  4. Application.StartupPath和System.Environment.CurrentDirectory的区别

    System.Environment.CurrentDirectory的含义是获取或设置当前工作路径,而Application.StartupPath是获取程序启动路径,表面上看二者没什么区别,但实际 ...

  5. DataTable,DataView 排序和使用

    我们都知道在Sql Server可以用order by来排序,所以很多朋友在DataTable中排序也想到了用order by关键字.但这样实现是比较困难的,下面,我们讲解一种比较简单的方法: 控制台 ...

  6. win32内存调用图

    https://msdn.microsoft.com/en-us/library/ms810603.aspxhttps://www.codeproject.com/Articles/14525/Hea ...

  7. 使用Visual Studio Code创建第一个ASP.NET Core应用程序

    全文翻译自:Your First ASP.NET Core Application on a Mac Using Visual Studio Code 这篇文章将向你展示如何在Mac上写出你的第一个A ...

  8. Office Add-in Model 简介

    原文地址:http://simpeng.net/office-add-in/office-add-in-model-%e7%ae%80%e4%bb%8b/ , 为了本博客内容的完整性,转载至此. Of ...

  9. QT运行cmd指令(两种办法:QProcess.start然后waitForFinished,运行cmd /c命令)

    QProcess p(); p.start("route");//写入要运行的指令即可 p.waitForStarted(); p.waitForFinished(); qDebu ...

  10. C语言实现常用数据结构——栈

    #include<stdio.h> #include<stdlib.h> //用链表实现栈 typedef struct Node { int data; struct Nod ...