P2218 [HAOI2007]覆盖问题

题目描述

某人在山上种了\(N\)棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用\(3\)个\(L*L\)的正方形塑料薄膜将小树遮起来。我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为\((X_i,Y_i)\),\(3\)个\(L*L\)的正方形的边要求平行于坐标轴,一个点如果在正方形的边界上,也算作被覆盖。当然,我们希望塑料薄膜面积越小越好,即求\(L\)最小值。

输入输出格式

输入格式:

第一行有一个正整数\(N\),表示有多少棵树。

接下来有\(N\)行,第\(i+1\)行有\(2\)个整数\(X_i\),\(Y_i\),表示第\(i\)棵树的坐标,保证不会有\(2\)个树的坐标相同。

输出格式:

一行,输出最小的\(L\)值。

说明

数据范围

\(100\%\)的数据,\(-1,000,000,000<=X_i,Y_i<=1,000,000,000\)

\(30\%\)的数据,\(N<=100\)

\(50\%\)的数据,\(N<=2000\)

\(100\%\)的数据,\(N<=20000\)


一道思路自然,感觉解法非常有道理但是想不到的题目(其实是我太菜)

二分答案+贪心或枚举放正方形,一般都可以想到这里来

然后怎么放呢。。。

考虑一些看起来非常容易忽视的条件

“\(3\)个\(L*L\)的正方形的边要求平行于坐标轴”

“3个”、“平行于坐标轴”

这是两个关键词

坐标轴是相互垂直的,那么如果我们用一个矩性围住点集,我们惊奇的发现,这个矩形是唯一的。

这里可能是比较跳跃,但是多试多换思路,其实是可能想到的。

然后“3个”正方形,我们发现矩形的每条边都需要和正方形的相接,因为边上必有点需要覆盖

因为矩形有四个边,我们发现有一个正方形必须去填角。

枚举!

然后只有两个正方形,而且剩余点集构成子问题

递归求解!

因为状态数非常少,所以很显然可过

总结一下,没什么思路的时候不妨多分析分析题目条件的特殊性究竟有什么意义,哪怕没什么感觉也多试几个想法


Code:

#include <cstdio>
#include <cstring>
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
const int N=20010;
const int inf=0x3f3f3f3f;
int dx[N],dy[N],used[N],l,r,up,down,n;
void get()
{
l=down=inf,r=up=-inf;
for(int i=1;i<=n;i++)
{
if(used[i]) continue;
l=min(l,dx[i]),r=max(r,dx[i]);
down=min(down,dy[i]),up=max(up,dy[i]);
}
}
bool check(int len,int rest)
{
get();
if(rest==1) return len>=max(r-l,up-down);
int l0=l,r0=r,up0=up,down0=down,flag=0,vis[N];
for(int i=1;i<=n;i++) vis[i]=used[i]; for(int i=1;i<=n;i++)
if(dx[i]>=l0&&dy[i]<=up0&&dx[i]<=l0+len&&dy[i]>=up0-len)
used[i]=1;
flag=max(flag,check(len,rest-1)); for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]>=l0&&dy[i]>=down0&&dx[i]<=l0+len&&dy[i]<=down0+len)
used[i]=1;
flag=max(flag,check(len,rest-1)); for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]<=r0&&dy[i]<=up0&&dx[i]>=r0-len&&dy[i]>=up0-len)
used[i]=1;
flag=max(flag,check(len,rest-1)); for(int i=1;i<=n;i++) used[i]=vis[i];
for(int i=1;i<=n;i++)
if(dx[i]<=r0&&dy[i]>=down0&&dx[i]>=r0-len&&dy[i]<=down0+len)
used[i]=1;
flag=max(flag,check(len,rest-1));
return flag;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d",dx+i,dy+i);
get();
int L=1,R=max(r-l,up-down);
while(L<R)
{
int mid=L+R>>1;
memset(used,0,sizeof(used));
if(check(mid,3))
R=mid;
else
L=mid+1;
}
printf("%d\n",L);
return 0;
}

2018.8.10

洛谷 P2218 [HAOI2007]覆盖问题 解题报告的更多相关文章

  1. 洛谷_Cx的故事_解题报告_第四题70

    1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h>   struct node {     long x,y,c; ...

  2. 洛谷 P2317 [HNOI2005]星际贸易 解题报告

    P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...

  3. 洛谷 P3802 小魔女帕琪 解题报告

    P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...

  4. 洛谷 P2606 [ZJOI2010]排列计数 解题报告

    P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...

  5. 洛谷1303 A*B Problem 解题报告

    洛谷1303 A*B Problem 本题地址:http://www.luogu.org/problem/show?pid=1303 题目描述 求两数的积. 输入输出格式 输入格式: 两个数 输出格式 ...

  6. 洛谷 P3084 [USACO13OPEN]照片Photo 解题报告

    [USACO13OPEN]照片Photo 题目描述 农夫约翰决定给站在一条线上的\(N(1 \le N \le 200,000)\)头奶牛制作一张全家福照片,\(N\)头奶牛编号\(1\)到\(N\) ...

  7. NOIP2015 D2T3 洛谷2680 BZOJ4326 运输计划 解题报告

    前言:个人认为这是历年NOIP中比较简单的最后一题了,因此将自己的思路与大家分享. 题目大意: 给一棵无根树,给出m条路径.允许将树上的一条边的权值改为0.求m条路径长度最大值的最小值.n,m< ...

  8. 洛谷 P3965 [TJOI2013]循环格 解题报告

    P3965 [TJOI2013]循环格 题目背景 一个循环格就是一个矩阵,其中所有元素为箭头,指向相邻四个格子. 每个元素有一个坐标(行,列),其中左上角元素坐标为\((0,0)\).给定一个起始位\ ...

  9. 洛谷 P2765 魔术球问题 解题报告

    P2765 魔术球问题 题目描述 问题描述: 假设有\(n\)根柱子,现要按下述规则在这\(n\)根柱子中依次放入编号为\(1,2,3,\dots\)的球. \((1)\) 每次只能在某根柱子的最上面 ...

随机推荐

  1. Python的Bottle框架中实现最基本的get和post的方法的教程

    这篇文章主要介绍了Python的Bottle框架中实现最基本的get和post的方法的教程,Bottle框架在Python开发者中的人气很高,需要的朋友可以参考下 1.GET方式: # -*- cod ...

  2. 总结laravel假数据填充步骤

    定义好模型 xxx.php 定义好数据生成的规则 database/factories/XxxlFactory.php 写入生成数据的代码,控制好生成的数据数目,对生成后的数据做出修改 databas ...

  3. 渗透测试实验(i春秋 真的很简单)

    首先利用给的提示: 所以用户名是 ichunqiu 密码是adab29e084ff095ce3eb 可以确定一般密码都是md5的,但是这个20位 应该去掉ada b29e084ff095ce3e才是正 ...

  4. PHP环境搭建-记录

    转于 http://jingyan.baidu.com/article/fcb5aff797ec41edaa4a71c4.html php5.5 做了大量的更新,在与apache搭配的时候如何选择也很 ...

  5. 2019年第十届蓝桥杯C/C++程序设计本科B组省赛 E迷宫

    试题 E: 迷宫 本题总分: 分 [问题描述] 下图给出了一个迷宫的平面图,其中标记为 的为障碍,标记为 的为可 以通行的地方. 迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它 ...

  6. [bzoj1359][Baltic2009]Candy

    给定N个数对$(T_i,S_i)$,表示时刻$S_i$时在位置$T_i$处出现一粒糖果.有一些机器人可供使用,每个机器人可花费一单位时间向相邻位置移动.要求用最少的机器人接到全部糖果.时刻0时机器人位 ...

  7. Git中从远程的分支获取最新的版本到本地——两种命令

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  8. 【多线程】 Task

    [多线程] Task 一. 常用方法: 1. ContinueWith : 当前 Task 完成后, 执行传入的 Task 2. Delay : 创建一个等待的 Task,只有在调用 Wait 方法时 ...

  9. 纯HTML+CSS实现阿童木头像

    他有十万马力,能上天能入地:他分辨善恶,是勇敢正义化身:1963年,他登上荧幕,在日本创下了未曾有过的高收视率……他叫阿童木,一个纯真.善良.勇 敢的机器娃娃.“阿童木之父”手冢治虫曾说,将阿童木生日 ...

  10. Java开发WebService(使用Java-WS)

    前言: 初学Java,因为工作需要,直接跳到开发WebService.以前用.NET开发过WebService,对比一下,Java的WebService开发部署难度高了不止一个档次.网上的教程各式各异 ...