一道不错的题,主要就是一个思路点,想到就行了,想不到就一直卡着。

看完题解之后发现挺简单,实际上自己挣扎半天也咩有想到。

一开始想类比成一维之后贪心,后来被同机房大佬 \(hack\) 掉了。

solution

首先二分答案,单调行很好证明,因为大矩形包含小矩形,现在的问题就是 \(check\) 函数

其实一个突破口就是只用三个矩形覆盖。

一维里面用几个矩形理论上都是通过输入给出的,所以一般的题的变量他通过常量给出来,可能就是突破口

对于题目中所有的点,肯定可以用一个大矩形套住,我们称之为“外接矩形”

思考一下可以发现,外接矩形的边上肯定有点,那么也一定有三个矩形的边(放边的原因是多放到外面肯定不如放到里面优

一个外接矩形有四条边,这就意味着,对于我们的三个矩形,肯定有一个要和两条边重合(也就是和一个角重合)

我们枚举是哪个角,之后把它范围内的点覆盖上,然后问题就变成了一个子问题(因为小于等于三个矩形都必须覆盖角,所以枚举角就可以了)。

然后经典的搜索和回溯就可以写完 \(check\) 函数。

code

(放着么美的代码有没有亮瞎您的眼?)

#include <cstring>
#include <algorithm>
#include <cstdio>
#define mp make_pair
#define R register int
#define int long
#define printf Ruusupuu = printf int Ruusupuu ; using namespace std ;
typedef long long L ;
typedef long double D ;
typedef unsigned long long G ;
typedef pair< int , int > PI ;
const int N = 2e4 + 10 ;
const int Inf = 1e9 + 10 ; inline int read(){
int w = 0 ; bool fg = 0 ; char ch = getchar() ;
while( ch < '0' || ch > '9' ) fg |= ( ch == '-' ) , ch = getchar() ;
while( ch >= '0' && ch <= '9' ) w = ( w << 1 ) + ( w << 3 ) + ( ch ^ '0' ) , ch = getchar() ;
return fg ? -w : w ;
} int n , mid , x [N] , y [N] ;
bool cvr [N] ;
int st [N] , top ; void sc(){
n = read() ;
for( R i = 1 ; i <= n ; i ++ ) x [i] = read() , y [i] = read() ;
} inline void rmcvr( int x ){ while( top > x ) cvr [st [top --]] = 0 ; } inline bool check( int now ){
if( top == n ) return 1 ;
if( now == 4 ) return 0 ; int l = Inf , r = -Inf , u = -Inf , d = Inf , bg = top ;
bool fg = 0 ; for( R i = 1 ; i <= n ; i ++ ) if( !cvr [i] ){
l = min( l , x [i] ) , r = max( r , x [i] ) ;
d = min( d , y [i] ) , u = max( u , y [i] ) ;
} // printf( "%ld %ld %ld %ld %ld\n" , now , l , r , u , d ) ; int ix , iy ; // left up
ix = l , iy = u ;
for( R i = 1 ; i <= n ; i ++ ) if( !cvr [i] ){
if( x [i] >= ix && x [i] <= ix + mid && y [i] >= iy - mid && y [i] <= iy ) cvr [i] = 1 , st [++ top] = i ;
} fg |= check( now + 1 ) ; rmcvr( bg ) ; if( fg ) return 1 ; // left down
ix = l , iy = d ;
for( R i = 1 ; i <= n ; i ++ ) if( !cvr [i] ){
if( x [i] >= ix && x [i] <= ix + mid && y [i] >= iy && y [i] <= iy + mid ) cvr [i] = 1 , st [++ top] = i ;
} fg |= check( now + 1 ) ; rmcvr( bg ) ; if( fg ) return 1 ; // right up
ix = r , iy = u ;
for( R i = 1 ; i <= n ; i ++ ) if( !cvr [i] ){
if( x [i] >= ix - mid && x [i] <= ix && y [i] >= iy - mid && y [i] <= iy ) cvr [i] = 1 , st [++ top] = i ;
} fg |= check( now + 1 ) ; rmcvr( bg ) ; if( fg ) return 1 ; // right down
ix = r , iy = d ;
for( R i = 1 ; i <= n ; i ++ ) if( !cvr [i] ){
if( x [i] >= ix - mid && x [i] <= ix && y [i] >= iy && y [i] <= iy + mid ) cvr [i] = 1 , st [++ top] = i ;
} fg |= check( now + 1 ) ; rmcvr( bg ) ; if( fg ) return 1 ; return 0 ;
} void work(){ int lside = 1 , rside = (int) 2e9 + 10 , ans ; while( lside <= rside ){
mid = ( 0ll + lside + rside ) >> 1 ;
if( check( 1 ) ) ans = mid , rside = mid - 1 ;
else lside = mid + 1 ;
} printf( "%ld\n" , ans ) ;
} signed main(){
sc() ;
work() ;
return 0 ;
}

题解—P2218 [HAOI2007]覆盖问题的更多相关文章

  1. 洛谷 P2218 [HAOI2007]覆盖问题 解题报告

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

  2. P2218 [HAOI2007]覆盖问题

    传送门 首先可以想到二分答案,然后考虑判断 注意到所有点的外包矩形的四条边一定要被覆盖到,而正方形只有 $3$ 个,所以一定有一个正方形在角落 考虑爆搜,枚举正方形在当前外包矩形的那个角,然后对剩下的 ...

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

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

  4. 【BZOJ1052】 [HAOI2007]覆盖问题

    BZOJ1052 [HAOI2007]覆盖问题 前言 小清新思维题. 最近肯定需要一些思维题挽救我这种碰到题目只会模板的菜鸡. 这题腾空出世? Solution 考虑一下我们二分答案怎么做? 首先转换 ...

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

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

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

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

  7. 【BZOJ】1052: [HAOI2007]覆盖问题(贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1052 首先膜拜题解orz,表示只能想到二分... 贪心就是每一次找到一个最小的能包围所有点的矩阵,然 ...

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

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

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

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

随机推荐

  1. NSDate小结

    dateFormat用法: y - 年 2013年,yyyy=2013,yy=13 M - 月 3月,M=3,MM=03,MMM=Mar,MMMM=March D - 一年中的第几天 d - 一月中的 ...

  2. mDNS知识

    1.域名系统(Domain Name System,缩写:DNS)是互联网的一项服务.它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网.DNS使用TCP和UDP端口53. ...

  3. QT单进程下载

    QT    同步下载 #include <QNetworkAccessManager> #include <QNetworkRequest> #include <QNet ...

  4. IE浏览器查看星号密码

    用CHROME打开保存密码的网页,F12,右击"密码框"检查,编辑属性:password改为passw(只要不是password即可)即可显示密码

  5. 两台Linux系统之间传输文件的几种方法

    两台Linux系统之间传输文件的几种方法:参考https://www.cnblogs.com/bignode/articles/9241333.html

  6. 如何在 PyCharm 中设置 Python 代码模板

    #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by iFantastic on $DATE if __name__ == '__mai ...

  7. response 重定向

    背景: controller层需要重定向到其他html界面时,需要用如下代码 // 设置302状态码 response.setStatus(302); // 设置location响应头 respons ...

  8. 第七篇--如何改变vs2017版的背景

    改变背景 C:\Users\zsunny\AppData\Local\Microsoft\VisualStudio\15.0_9709afbe\Extensions\o0g0c52k.3od\Imag ...

  9. RegisterClass/RegisterClassEx -- 注册窗口类

    (1)函数原型 1 //RegisterClass 2 ATOM RegisterClass( 3 const WNDCLASS * lpWndClass //Long pointer to a WN ...

  10. lis分析之一一批处理(任务)如何连接数据库的

    public class ZFBCheckAccountTask extends TaskThread { } 这个类运行时候自动加载了数据库连接,不明白是如何提前加载的,开始用static { } ...