http://www.lydsy.com/JudgeOnline/problem.php?id=1052

首先膜拜题解orz,表示只能想到二分。。。

贪心就是每一次找到一个最小的能包围所有点的矩阵,然后枚举四个角放正方形。

不会证QAQ(填坑:似乎就因为正方形的边长是相等的有关?应该是的,假如只放一个正方形的中心点为(x,y),那么显然(x+L/2, y+L/2)(x-L/2, y-L/2)要覆盖所有点,显然最优的正方形的一个顶点恰好覆盖到能包围所有点的矩形中的一个角(否则无法覆盖所有点),所以只需要枚举四个角放正方形即可。)

然后被sb错吊打了半小时。。。

又是自以为的开全局变量没想到局部改变。。。

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
using namespace std;
typedef long long ll;
#define pii pair<int, int>
#define mkpii make_pair<int, int>
#define pdi pair<double, int>
#define mkpdi make_pair<double, int>
#define pli pair<ll, int>
#define mkpli make_pair<ll, int>
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << (#x) << " = " << (x) << endl
#define error(x) (!(x)?puts("error"):0)
#define printarr2(a, b, c) for1(_, 1, b) { for1(__, 1, c) cout << a[_][__]; cout << endl; }
#define printarr1(a, b) for1(_, 1, b) cout << a[_] << '\t'; cout << endl
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; }
const int N=40005, oo=~0u>>2;
int n, vis[N];
struct dat { int x, y; }a[N];
void ifind(int &x1, int &y1, int &x2, int &y2) {
x1=y1=oo; x2=y2=-oo;
for1(i, 1, n) if(!vis[i]) x1=min(x1, a[i].x), x2=max(x2, a[i].x), y1=min(y1, a[i].y), y2=max(y2, a[i].y);
}
void fix(const int &x1, const int &y1, const int &x2, const int &y2, const int &dep) { for1(i, 1, n) if(!vis[i] && a[i].x>=x1 && a[i].x<=x2 && a[i].y>=y1 && a[i].y<=y2) vis[i]=dep; }
bool find(int dep, const int &L) {
int x[2], y[2];
ifind(x[0], y[0], x[1], y[1]);
if(max(x[1]-x[0], y[1]-y[0])<=L) return true;
if(dep==3) return false;
rep(i, 2) rep(j, 2) {
if(i==0) {
if(j==0) fix(x[i], y[j], x[i]+L, y[j]+L, dep);
else fix(x[i], y[j]-L, x[i]+L, y[j], dep);
}
else {
if(j==0) fix(x[i]-L, y[j], x[i], y[j]+L, dep);
else fix(x[i]-L, y[j]-L, x[i], y[j], dep);
}
//printf("dep:%d, (%d,%d), (%d,%d)\n", dep, x[0], y[0], x[1], y[1]);
//for1(i, 1, n) printf("%d ", vis[i]); puts("");
if(find(dep+1, L)) return true;
for1(i, 1, n) if(vis[i]==dep) vis[i]=0;
}
return false;
}
bool check(int L) {
memset(vis, 0, sizeof(int)*(n+2)); //dbg(L);
return find(1, L);
} int main() {
read(n);
for1(i, 1, n) read(a[i].x), read(a[i].y);
int x[2], y[2];
ifind(x[0], y[0], x[1], y[1]);
int l=1, r=max(x[1]-x[0], y[1]-y[0]);
while(l<=r) {
int mid=(l+r)>>1;
if(check(mid)) r=mid-1;
else l=mid+1;
}
print(r+1);
return 0;
}

  


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

Source

【BZOJ】1052: [HAOI2007]覆盖问题(贪心)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. 【BZOJ】1052: [HAOI2007]覆盖问题

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1052 大概自己YY了个贪心然后过了... 二分答案,考虑如何check: 找到一个最小的矩 ...

  7. 1052: [HAOI2007]覆盖问题 - BZOJ

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

  8. bzoj1052 [HAOI2007]覆盖问题 - 贪心

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

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

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

随机推荐

  1. ant design pro (四)新增页面

    一.概述 参看地址:https://pro.ant.design/docs/new-page-cn 这里的『页面』指配置了路由,能够通过链接直接访问的模块,要新建一个页面,通常只需要在脚手架的基础上进 ...

  2. react-keeper

    通过 react-keeper 替换掉 react-router 解决 页面缓存问题.

  3. ReadOnly field saved with NULL value

    On CRM opportunity form view, i added readonly="1" for probability field. When i saved, wh ...

  4. wait & waitpid 以及子进程传给父进程的信号分析

    wait() 和 waitpid() wait() 系统调用挂起调用进程的执行直到有一个孩子终止.调用 wait(&status) 等价于: waitpid(-1, &status, ...

  5. java反射-获取方法信息

    例子代码如下: package com.reflect; import java.lang.reflect.Method; public class ClassUtill { /* * 打印类的信息, ...

  6. Java泛型入门

      Java泛型入门 在学习本章之前,须要对Java的集合(Collection.Map)有一定的基础. Java集合有一个缺点.就是把一个对象"丢进"集合里后,集合就会&qu ...

  7. PHP-静态方法(static)继承等分析

    <?php class A { const CONST_NAME = 'A'; public static $static_name = 'A'; public static $static_n ...

  8. 【LeetCode】106. Construct Binary Tree from Inorder and Postorder Traversal

    Construct Binary Tree from Inorder and Postorder Traversal Given inorder and postorder traversal of ...

  9. 流类库继承体系(IO流,文件流,串流)和 字符串流的基本操作

    一.IO.流 数据的输入和输出(input/output简写为I/O) 对标准输入设备和标准输出设备的输入输出简称为标准I/O 对在外存磁盘上文件的输入输出简称为文件I/O 对内存中指定的字符串存储空 ...

  10. Mybatis 中延时加载

    1 为了处理N+1 问题,Mybatis 引入了延时加载功能,意义是一开始并不取出关联数据,只有当使用时,才发送sql语句去取. mybatis中两个全局设置 lazyLoadingEnabled 和 ...