1052: [HAOI2007]覆盖问题

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2004  Solved: 937
[Submit][Status][Discuss]

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

  

  这道题当时一看还以为是一道几何题,就先放着最后打然后就华丽丽的爆零了。

  最后正解并不是我当初第一反应的几何,但确实是我当时第二反应——二分答案,exciting……

  我们可以通过一个无法用语言描述的证明可知至少有一个正方形是位于最小矩形的一个角上的。因为一共就三个正方形,所以我们dfs每个正方形位于当前最小矩形的四个角的情况就好了,那么时间复杂度就是O(log (2*10^9)*n*64)轻松搞掉。

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<queue>
  6. #include<algorithm>
  7. #include<cmath>
  8. #include<map>
  9. #include<vector>
  10. #define N 20005
  11. using namespace std;
  12. int n,xx,nx,xy,ny;
  13. bool fw[N];
  14. struct no
  15. {
  16. int x,y;
  17. }node[N];
  18. bool dfs(long long L,int x,int sum)
  19. {
  20. if(sum==n)return ;
  21. if(x==)
  22. return ;
  23. int xxx=-0x7fffffff,nnx=0x7fffffff,xxy=-0x7fffffff,nny=0x7fffffff;
  24. if(x==)
  25. xxx=xx,nnx=nx,xxy=xy,nny=ny;
  26. else
  27. {
  28. for(int i=;i<=n;i++)
  29. {
  30. if(fw[i])continue;
  31. if(node[i].x>xxx) xxx=node[i].x;
  32. if(node[i].x<nnx) nnx=node[i].x;
  33. if(node[i].y>xxy) xxy=node[i].y;
  34. if(node[i].y<nny) nny=node[i].y;
  35. }
  36. }
  37. bool b[N];
  38. int t=sum;
  39. memcpy(b,fw,sizeof(fw));
  40. for(int i=;i<=n;i++)
  41. {
  42. if(!fw[i]&&node[i].x<=nnx+L&&node[i].y<=nny+L)
  43. fw[i]=,t++;
  44. }
  45. if(dfs(L,x+,t)) return ;
  46. memcpy(fw,b,sizeof(b));
  47. t=sum;
  48. for(int i=;i<=n;i++)
  49. {
  50. if(!fw[i]&&node[i].x<=nnx+L&&node[i].y>=xxy-L)
  51. fw[i]=,t++;
  52. }
  53. if(dfs(L,x+,t)) return ;
  54.  
  55. memcpy(fw,b,sizeof(b));
  56. t=sum;
  57. for(int i=;i<=n;i++)
  58. {
  59. if(!fw[i]&&node[i].x>=xxx-L&&node[i].y<=nny+L)
  60. fw[i]=,t++;
  61. }
  62. if(dfs(L,x+,t)) return ;
  63.  
  64. t=sum;
  65. memcpy(fw,b,sizeof(b));
  66. for(int i=;i<=n;i++)
  67. {
  68. if(!fw[i]&&node[i].x>=xxx-L&&node[i].y>=xxy-L)
  69. fw[i]=,t++;
  70. }
  71. if(dfs(L,x+,t)) return ;
  72. memcpy(fw,b,sizeof(b));
  73. return ;
  74. }
  75. int main()
  76. {
  77. scanf("%d",&n);
  78. xx=-0x7fffffff,nx=0x7fffffff,ny=0x7fffffff,xy=-0x7fffffff;
  79. for(int i=;i<=n;i++)
  80. {
  81. scanf("%d%d",&node[i].x,&node[i].y);
  82. if(node[i].x>xx) xx=node[i].x;
  83. if(node[i].x<nx) nx=node[i].x;
  84. if(node[i].y>xy) xy=node[i].y;
  85. if(node[i].y<ny) ny=node[i].y;
  86. fw[i]=;
  87. }
  88. long long li=,ri=max(xy-ny,xx-nx);
  89. while(li<=ri)
  90. {
  91. long long mid=(li+ri)>>;
  92. memset(fw,,sizeof(fw));
  93. if(dfs(mid,,))ri=mid-;
  94. else li=mid+;
  95. }
  96. printf("%lld\n",ri+);
  97. return ;
  98. }

bzoj1052 9.20考试 第二题 覆盖问题的更多相关文章

  1. 9.18考试 第二题Dinner题解

    当时初步感觉是一个类似动归或者贪心的神题,然而由于本题已经给出顺序,贪心貌似并没有什么道理,所以放弃贪心.然后又由于这是一个环的问题,我想到了“合并石子”那种环转链的思路,然后就是一个O(n^2*m) ...

  2. 2017 五一 清北学堂 Day1模拟考试结题报告

    预计分数:100+50+50 实际分数:5+50+100 =.= 多重背包 (backpack.cpp/c/pas) (1s/256M) 题目描述 提供一个背包,它最多能负载重量为W的物品. 现在给出 ...

  3. CSDN挑战编程——《金色十月线上编程比赛第二题:解密》

    金色十月线上编程比赛第二题:解密 题目详情: 小强是一名学生, 同一时候他也是一个黑客. 考试结束后不久.他吃惊的发现自己的高等数学科目竟然挂了,于是他果断入侵了学校教务部站点. 在入侵的过程中.他发 ...

  4. NOIP2005-普及组复赛-第二题-校门外的树

    题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0 ...

  5. 【LOJ#6066】「2017 山东一轮集训 Day3」第二题(哈希,二分)

    [LOJ#6066]「2017 山东一轮集训 Day3」第二题(哈希,二分) 题面 LOJ 题解 要哈希是很显然的,那么就考虑哈希什么... 要找一个东西可以表示一棵树,所以我们找到了括号序列. 那么 ...

  6. RHCSA考试真题

    2018年 RHCSA考试真题... ------------ 考前需要做的基础 破解root密码 KVM虚拟机与VM虚拟机 主机名:station.domain1.example.comIP地址:1 ...

  7. 【BZOJ4928】第二题 树hash+倍增

    [BZOJ4928]第二题 Description 对于一棵有根树,定义一个点u的k-子树为u的子树中距离u不超过k的部分. 注意,假如u的子树中不存在距离u为k的点,则u的k-子树是不存在的. 定义 ...

  8. 中国MOOC_面向对象程序设计——Java语言_期末考试编程题_1细胞自动机

    期末考试编程题 返回   这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成 ...

  9. Java蓝桥杯02——第二题集锦:生日蜡烛、星期一、方格计数、猴子分香蕉

    第二题 生日蜡烛(结果填空) 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填 ...

随机推荐

  1. 前端开发常用PhotoShop快捷键整理(更新中)

    图片来源 UI提供的psd图 印屏幕:PrScrn SysRq(键盘按键) 浏览器(插件)获取 常用的快捷键: 新建 Ctrl + N 取消选框 Ctrl + D 反选 Ctrl + shift + ...

  2. 使用NEWSEQUENTIALID解决GUID聚集索引问题

    原文:使用NEWSEQUENTIALID解决GUID聚集索引问题 UNIQUEIDENTIFIER做主键(Primary Key)是一件很方便的事情,在数据合并等操作中有不可替代的优势 但是由于普通的 ...

  3. LINQ查询表达式---------let子句

    LINQ查询表达式---------let子句 let子句创建一个范围变量来存储结果,变量被创建后,不能修改或把其他表达式的结果重新赋值给它.此范围变量可以再后续的LINQ子句中使用. class P ...

  4. Android零基础入门第63节:过时但仍值得学习的选项卡TabHost

    原文:Android零基础入门第63节:过时但仍值得学习的选项卡TabHost 由于前几天参加一个学习培训活动,几乎每天都要从早晨7点到晚上一两点,没有什么时间来分享,实在抱歉中间断更了几天.从今天开 ...

  5. 百度 Echarts 地图表 js 引用路径

    使用地图表格,除了需echarts,还需zrender,自行下载JS文件:   目标,做成这样的效果:http://echarts.baidu.com/doc/example/map3.html   ...

  6. RtlAdjustPrivilege进程提权,权限ID对照表

    SeCreateTokenPrivilege            0x2 SeAssignPrimaryTokenPrivilege     0x3 SeLockMemoryPrivilege    ...

  7. QT多个UI文件加入一个项目

    这样可在多个UI界面上进行分部开发.避免都在一个UI下太凌乱…… 在网上找了一些资料,很少有介绍这方面的,以及类似这样项目的源码. 看 一些基本控件的使用时,想到了一种方法:使用gridLayout控 ...

  8. iOS11中iOS处理GIF图片的方式

      GIF 五部走如下 :   1 从相册中取出GIF图的Data 2 通过腾讯的IM发送Gif图 3 展示GIF图 4 GIF图URL缓存机制 5 将展示的GIF图存到相册中     一  从相册中 ...

  9. 原生Js封装的产品图片360度展示

    挺简单的一段程序,但是效果不错: 1.把需要展示的36张图片先预加载到浏览器缓存里 2.给展示图片的div添加方法 3.通过鼠标左右移动的像素转换图片 在线效果预览:http://jsfiddle.n ...

  10. UbuntuServer添加软件源列表

    要使用Ubuntu前,我们一般都要先做好工具!特别是对于安装这一块~~~~ 1.配置前,先做个配置文件的备份: $sudo cp /etc/apt/sources.list /etc/apt/sour ...