bzoj1052覆盖问题(二分+贪心)
1052: [HAOI2007]覆盖问题
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2446 Solved: 1131
[Submit][Status][Discuss]
Description
Input
Output
一行,输出最小的L值。
Sample Input
0 1
0 -1
1 0
-1 0
Sample Output
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覆盖问题(二分+贪心)的更多相关文章
- [BZOJ1052][HAOI2007]覆盖问题 二分+贪心
1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2053 Solved: 959 [Submit][Sta ...
- 【BZOJ1052】覆盖问题(贪心)
[BZOJ1052]覆盖问题(贪心) 题面 BZOJ 洛谷 题解 这题好神仙啊. 很明显可以看出来要二分一个边长. 那么如何\(check\)呢? 我们把所有点用一个最小矩形覆盖, 那么必定每个边界上 ...
- $bzoj2067\ szn$ 二分+贪心
正解:二分+贪心 解题报告: 传送门$QwQ$ 题目大意就说有一棵树,然后要用若干条线覆盖所有边且不能重叠.问最少要用几条线,在用线最少的前提下最长的线最短是多长. 昂首先最少用多少条线这个还是蛮$e ...
- Codeforces Gym 100231B Intervals 线段树+二分+贪心
Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...
- 2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 二分+贪心
/** 题目:2016-2017 ACM-ICPC CHINA-Final Ice Cream Tower 链接:http://codeforces.com/gym/101194 题意:给n个木块,堆 ...
- 【bzoj2097】[Usaco2010 Dec]Exercise 奶牛健美操 二分+贪心
题目描述 Farmer John为了保持奶牛们的健康,让可怜的奶牛们不停在牧场之间 的小路上奔跑.这些奶牛的路径集合可以被表示成一个点集和一些连接 两个顶点的双向路,使得每对点之间恰好有一条简单路径. ...
- Codeforces_732D_(二分贪心)
D. Exams time limit per test 1 second memory limit per test 256 megabytes input standard input outpu ...
- CF732D Exams 二分 贪心
思路:二分+贪心 提交次数:10次以上 错因:刚开始以为二分(边界,$+1or-1$)写错了,调了半天,后来才发现是$ck()$写错了.开始只判了最后是否小于零,而应该中间一旦小于零就$return\ ...
- $CF949D\ Curfew$ 二分/贪心
正解:二分/贪心 解题报告: 传送门$QwQ$ 首先这里是二分还是蛮显然的?考虑二分那个最大值,然后先保证一个老师是合法的再看另一个老师那里是否合法就成$QwQ$. 发现不太会搞这个合不合法的所以咕了 ...
随机推荐
- js变量类型详解
<html> <title>js变量类型详解</title> <meta http-equiv="content-type" conten ...
- Java Class 利用classpath来获取源文件地址
利用classpath来获取源文件地址 @author ixenos 应用场景 Properties props = new Properties(); /** * . 代表java命令运行的目录 * ...
- 删除右键open foler as pycharm project(WIN10)
1.打开注册表(WIN+R 输入regedit) 2.找到 HKEY_CLASSES_ROOT\Directory\Background 路径 下找到Parcharm文件夹,删除,右键的open fo ...
- msp430入门编程0
msp430单片机最小系统 msp430入门学习 msp430入门编程
- 转 POJ分类
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
- SOJ 3300_Stockholm Coins
[题意]给n个数,求一个数,使这个数能且只能由(n个数每个至少出现一次)表示.输出满足条件的最小的数. [分析](完全背包)如果有满足条件的最小的数,那么这个数只能是这n个数的和total,通过记录每 ...
- 【小记事】电脑命令行开WiFi
1.设置WiFi名称和密码 在命令行输入: netsh wlan set hostednetwork mode=allow WiFi名称 key=密码 2.开启WiFi 在命令行输入: netsh w ...
- hihocoder1496(高维前缀和)
题意:给定N个数A1, A2, A3, ... AN,小Ho想从中找到两个数Ai和Aj(i ≠ j)使得乘积Ai × Aj × (Ai AND Aj)最大.其中AND是按位与操作. 第一行一个整数N( ...
- 查找olr备份路径
使用:ocrdump -local <olr_dump_name> more <olr_dump_name> 来查找 [SYSTEM.OLR.BACKUP.LOC] 的相应键值 ...
- 两个月后才更新一篇。。。。LIB和DLL的差别
共同拥有两种库: 一种是LIB包括了函数所在的DLL文件和文件里函数位置的信息(入口).代码由执行时载入在进程空间中的DLL提供,称为动态链接库dynamic link library. 一种是 ...