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

题意:找到一个最小边长,使得以此为边长$3$个正方形可以覆盖平面上给定的一些点。

华丽爆零……

首先看到最小果断想二分答案……

然后我们证明一个东西……

首先,根据鸽巢原理,$3$个正方形覆盖由所有点构成的最小矩形一定有一个正方形是压着至少两条边的……

然后不外乎两种情况……

1、压的是对边,那么每个都在压对边,有一个正方形会压到三条边,就会压到一个角……

2、压的是邻边,一定会压到一个角……

那么方案就出来了……对于每个正方形,枚举压到了哪个角然后暴力排除每一个被覆盖的点……之后递归搜索新的矩形并继续……

问题得解……

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=(int)1e6+5;
 7 int x[maxn],y[maxn],n,ax[4],ay[4],ajia[4],ajian[4];bool vis[maxn],now[4][maxn];int titai[3]={0,1,-1};
 8 bool dfs(int num,int val)
 9 {
10     if(num>3)
11     {
12         for(int i=1;i<=n;i++)
13             if(!vis[i])return 0;
14         return 1;
15     }
16     int maxx=-2147483647,minx=2147483647,maxy=-2147483647,miny=2147483647;
17     for(int i=1;i<=n;i++)
18         if(!vis[i])maxx=max(maxx,x[i]),minx=min(minx,x[i]),maxy=max(maxy,y[i]),miny=min(miny,y[i]);
19     if(max(maxx-minx,maxy-miny)<=val)return 1;
20     else if(num==3)return 0;
21     for(int i=1;i<=2;i++)
22         for(int j=1;j<=2;j++)
23         {
24             ajia[num]=titai[i],ajian[num]=titai[j];
25             if(ajia[num]==1&&ajian[num]==1)ax[num]=minx,ay[num]=miny;
26             else if(ajia[num]==1&&ajian[num]==-1)ax[num]=minx,ay[num]=maxy;
27             else if(ajia[num]==-1&&ajian[num]==1)ax[num]=maxx,ay[num]=miny;
28             else if(ajia[num]==-1&&ajian[num]==-1)ax[num]=maxx,ay[num]=maxy;
29             for(int i=1;i<=n;i++)
30                 if(!vis[i]&&((ajia[num]==1&&ajian[num]==1&&ax[num]<=x[i]&&ay[num]<=y[i]&&ax[num]+val>=x[i]&&ay[num]+val>=y[i])||(ajia[num]==1&&ajian[num]==-1&&ax[num]<=x[i]&&ay[num]>=y[i]&&ax[num]+val>=x[i]&&ay[num]-val<=y[i])||(ajian[num]==1&&ajia[num]==-1&&ay[num]<=y[i]&&ax[num]>=x[i]&&ay[num]+val>=y[i]&&ax[num]-val<=x[i])||(ajian[num]==-1&&ajia[num]==-1&&ay[num]>=y[i]&&ax[num]>=x[i]&&ay[num]-val<=y[i]&&ax[num]-val<=x[i])))vis[i]=now[num][i]=1;
31             int t=dfs(num+1,val);
32             for(int i=1;i<=n;i++)if(now[num][i])vis[i]=now[num][i]=0;
33             if(t)return 1;
34         }
35     return 0;
36 }
37 bool check(int val)
38 {
39     return dfs(1,val);
40 }
41 int haha()
42 {
43     scanf("%d",&n);int maxx=-2147483647,minx=2147483647,maxy=-2147483647,miny=2147483647;
44     for(int i=1;i<=n;i++)scanf("%d%d",&x[i],&y[i]),maxx=max(maxx,x[i]),minx=min(minx,x[i]),maxy=max(maxy,y[i]),miny=min(miny,y[i]);
45     int l=1,r=max(maxx-minx,maxy-miny),mid;
46     while(l<=r)
47     {
48         mid=(l+r)>>1;
49         if(check(mid))r=mid-1;
50         else l=mid+1;
51     }
52     printf("%d\n",l);
53 }
54 int sb=haha();
55 int main(){;}

bzoj1052

转载于:https://www.cnblogs.com/Loser-of-Life/p/7575669.html

bzoj1052 覆盖问题 二分答案 dfs相关推荐

  1. 道路覆盖 (二分答案+状压DP)

    Description: Tar 把一段凹凸不平的路分成了高度不同的 N 段(每一段相同高度),并用 H[i] 表示第 i 段高度.现在 Tar 一共有 n 种泥土可用,它们都能覆盖给定的连续的 k ...

  2. 【二分答案】【DFS】【分类讨论】Gym - 100851F - Froggy Ford

    题意:河里有n块石头,一只青蛙要从左岸跳到右岸,你可以再在任意一个位置放一块石头,使得在最优方案下,青蛙单步跳的距离的最大值最小化,输出该位置. 将原图视作完全图,二分答案mid,然后在图中只保留小于 ...

  3. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  4. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  5. CH Round #72树洞[二分答案 DFSBFS]

    树洞 CH Round #72 - NOIP夏季划水赛 描述 在一片栖息地上有N棵树,每棵树下住着一只兔子,有M条路径连接这些树.更特殊地是,只有一棵树有3条或更多的路径与它相连,其它的树只有1条或2 ...

  6. 2019暑假篇——巨树(二分答案)

    目录 一.题目 1.描述 2.输入 3.输出 4.样例输入 5.样例输出 二.题解 1.算法 2.细节 三.代码 谢谢! 一.题目 1.描述 给出一颗 N 个节点的树和 M 个关键节点以及无线数据传输 ...

  7. 【枚举】【二分答案】【分块答案】【BFS】【最大流】【Dinic】bzoj1189 [HNOI2007]紧急疏散evacuate...

    [法一]枚举Time(0~N*M): S->'.'(1); 'D'->T(Time); '.'->'D'(dis(用BFS预处理,注意一旦到达'D',BFS就不能继续扩展了,注意di ...

  8. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 小 ...

  9. BZOJ 3993 Luogu P3324 [SDOI2015]星际战争 (最大流、二分答案)

    字符串终于告一段落了! 题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3993 (luogu) https://www.l ...

  10. BZOJ 1305 dance跳舞(最大流+二分答案)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1305 解题思路: 转自:https://blog.csdn.net/u012288458 ...

最新文章

  1. 【PC工具】几个提高工作效率的工具素材网站,美化代码,精美图标,logo设计...
  2. 大神接棒,YOLOv4来了!
  3. 方法重写(Java篇)
  4. 灵魂一问-如何彻底防止APK反编译?成功定级腾讯T3-2
  5. linux系统安装显卡驱动卡顿,关于Ubuntu16.04上N卡驱动导致滚动屏幕卡顿问题
  6. es6 Promise.all()方法
  7. 使用Eclipse查看反编译后的代码(Decompiler 插件)
  8. cmd合并多个ts文件,ffmpeg快速转ts为mp4文件,通过m3u8合并文件
  9. 2013年总结(4)-人脉
  10. iOS 开发 初级:应用内购买 In-App Purchase
  11. 设计模式--模板方法模式(12)
  12. 台式计算机不用鼠标怎么关机,没有鼠标怎么关机
  13. 语义分割—遥感影像数据标签制作(ARCGIS)
  14. mysql5.5手册读书日记(3)
  15. 恢复被文件夹病毒恶意隐藏的文件夹
  16. 创意几何点线面三角形孟菲斯海报banneer广告设计ai矢量背景素材
  17. MacOS中图片的路径表示
  18. css表格怎么垂直居中对齐,css表格垂直居中怎么设置?
  19. (图文)自己组建自己迷你linux系统
  20. 世界上第一台通用计算机的英语缩写,世界上第一台计算机诞生

热门文章

  1. android手机有哪些版本,支持安卓5.0的手机有哪些 android5.0手机汇总
  2. 并发编程——Forkjoin设计模式原理
  3. 来自我的网易博客的文章
  4. neo4j算法插件-GDS安装
  5. bilibili无水印php,bilibili播放器带弹幕接口源码
  6. 快递面单成信息泄露重灾区,隐私面单成“必选项”
  7. 用 ABAP 调用 OCR 接口实现出租车发票扫描
  8. 整合阿里云域名 + 腾讯云 CDN + 又拍云存储的使用流程
  9. c语言中sub是什么指令,汇编 – SUB指令的目的是什么?
  10. 9.3 parity概述