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:

  1. #include <cstdio>
  2. #include <cstring>
  3. int min(int x,int y){return x<y?x:y;}
  4. int max(int x,int y){return x>y?x:y;}
  5. const int N=20010;
  6. const int inf=0x3f3f3f3f;
  7. int dx[N],dy[N],used[N],l,r,up,down,n;
  8. void get()
  9. {
  10. l=down=inf,r=up=-inf;
  11. for(int i=1;i<=n;i++)
  12. {
  13. if(used[i]) continue;
  14. l=min(l,dx[i]),r=max(r,dx[i]);
  15. down=min(down,dy[i]),up=max(up,dy[i]);
  16. }
  17. }
  18. bool check(int len,int rest)
  19. {
  20. get();
  21. if(rest==1) return len>=max(r-l,up-down);
  22. int l0=l,r0=r,up0=up,down0=down,flag=0,vis[N];
  23. for(int i=1;i<=n;i++) vis[i]=used[i];
  24. for(int i=1;i<=n;i++)
  25. if(dx[i]>=l0&&dy[i]<=up0&&dx[i]<=l0+len&&dy[i]>=up0-len)
  26. used[i]=1;
  27. flag=max(flag,check(len,rest-1));
  28. for(int i=1;i<=n;i++) used[i]=vis[i];
  29. for(int i=1;i<=n;i++)
  30. if(dx[i]>=l0&&dy[i]>=down0&&dx[i]<=l0+len&&dy[i]<=down0+len)
  31. used[i]=1;
  32. flag=max(flag,check(len,rest-1));
  33. for(int i=1;i<=n;i++) used[i]=vis[i];
  34. for(int i=1;i<=n;i++)
  35. if(dx[i]<=r0&&dy[i]<=up0&&dx[i]>=r0-len&&dy[i]>=up0-len)
  36. used[i]=1;
  37. flag=max(flag,check(len,rest-1));
  38. for(int i=1;i<=n;i++) used[i]=vis[i];
  39. for(int i=1;i<=n;i++)
  40. if(dx[i]<=r0&&dy[i]>=down0&&dx[i]>=r0-len&&dy[i]<=down0+len)
  41. used[i]=1;
  42. flag=max(flag,check(len,rest-1));
  43. return flag;
  44. }
  45. int main()
  46. {
  47. scanf("%d",&n);
  48. for(int i=1;i<=n;i++)
  49. scanf("%d%d",dx+i,dy+i);
  50. get();
  51. int L=1,R=max(r-l,up-down);
  52. while(L<R)
  53. {
  54. int mid=L+R>>1;
  55. memset(used,0,sizeof(used));
  56. if(check(mid,3))
  57. R=mid;
  58. else
  59. L=mid+1;
  60. }
  61. printf("%d\n",L);
  62. return 0;
  63. }

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. MySQL学习路线图

  2. python系列7进程线程和协程

    目录 进程 线程 协程  上下文切换 前言:线程和进程的关系图 由下图可知,在每个应用程序执行的过程中,都会去产生一个主进程和主线程来完成工作,当我们需要并发的执行的时候,就会通过主进程去生成一系列的 ...

  3. UVA10474 Where is the Marble?【排序】

    参考:https://blog.csdn.net/q547550831/article/details/51326321 #include <iostream> #include < ...

  4. DDR分析与布线要求

    基本知识 Double Data Rate Synchronous Dynamic Random Access Memory 简称 DDR SDRAM 双倍数据率同步动态随机存取内存 DDR SDRA ...

  5. C++11中std::function的使用

    class template std::function is a general-purpose polymorphic function wrapper. Instances of std::fu ...

  6. linux 操作之一 如何在linux将本地数据*.sql文件导入到linux 云服务器上的mysql数据库

    liunx 版本ubuntu 16.4 mysql 版本  5.6 1)准备*.sql文件 (* 是准备导入的sql文件的名字) 2)liunx 远程客户端  SecureCRT 7.0 alt+p ...

  7. malloc分配失败的两个现象

    在实际代码中,malloc的反复分配释放,可能会导致某一次malloc分配失败,虽然上一次调用malloc分配成功(然后释放),下一次在相同地方调用malloc分配可能会失败,疑问在于,既然上一次分配 ...

  8. Smart Framework:轻量级 Java Web 框架

    Smart Framework:轻量级 Java Web 框架 收藏 黄勇   工作闲暇之余,我开发了一款轻量级 Java Web 框架 —— Smart Framework. 开发该框架是为了: 加 ...

  9. 谷歌js编码规范解析

    http://alloyteam.github.io/JX/doc/specification/google-javascript.xm 阅读了谷歌js编码规范,我发现了很多,js的里面很多要注意的问 ...

  10. 【多校联合】(HDU6045)Is Derek lying?

    分析 之前没有想到题目解法,看了题解才会,记录一下思考过程. 这条题目的实质是,在满足合法的情况下,有没有a和d的可行解?也就是说,不要仅仅附在表面的思考逻辑条件,而是要思考实际的数学表达. 转化为数 ...