bzoj1052 9.20考试 第二题 覆盖问题

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 1;
21     if(x==4)
22         return 0;
23     int xxx=-0x7fffffff,nnx=0x7fffffff,xxy=-0x7fffffff,nny=0x7fffffff;
24     if(x==1)
25         xxx=xx,nnx=nx,xxy=xy,nny=ny;
26     else
27     {
28         for(int i=1;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=1;i<=n;i++)
41     {
42         if(!fw[i]&&node[i].x<=nnx+L&&node[i].y<=nny+L)
43             fw[i]=1,t++;
44     }
45     if(dfs(L,x+1,t)) return 1;
46     memcpy(fw,b,sizeof(b));
47     t=sum;
48     for(int i=1;i<=n;i++)
49     {
50         if(!fw[i]&&node[i].x<=nnx+L&&node[i].y>=xxy-L)
51             fw[i]=1,t++;
52     }
53     if(dfs(L,x+1,t)) return 1;
54
55     memcpy(fw,b,sizeof(b));
56     t=sum;
57     for(int i=1;i<=n;i++)
58     {
59         if(!fw[i]&&node[i].x>=xxx-L&&node[i].y<=nny+L)
60             fw[i]=1,t++;
61     }
62     if(dfs(L,x+1,t)) return 1;
63
64     t=sum;
65     memcpy(fw,b,sizeof(b));
66     for(int i=1;i<=n;i++)
67     {
68         if(!fw[i]&&node[i].x>=xxx-L&&node[i].y>=xxy-L)
69             fw[i]=1,t++;
70     }
71     if(dfs(L,x+1,t)) return 1;
72     memcpy(fw,b,sizeof(b));
73     return 0;
74 }
75 int main()
76 {
77     scanf("%d",&n);
78     xx=-0x7fffffff,nx=0x7fffffff,ny=0x7fffffff,xy=-0x7fffffff;
79     for(int i=1;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]=0;
87     }
88     long long li=0,ri=max(xy-ny,xx-nx);
89     while(li<=ri)
90     {
91         long long mid=(li+ri)>>1;
92         memset(fw,0,sizeof(fw));
93         if(dfs(mid,1,0))ri=mid-1;
94         else li=mid+1;
95     }
96     printf("%lld\n",ri+1);
97     return 0;
98 }

时间: 2024-08-28 04:47:22

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

9.18考试 第二题Dinner题解

当时初步感觉是一个类似动归或者贪心的神题,然而由于本题已经给出顺序,贪心貌似并没有什么道理,所以放弃贪心.然后又由于这是一个环的问题,我想到了"合并石子"那种环转链的思路,然后就是一个O(n^2*m)的近似背包的打法,虽然没有去打,但应该可行吧-- 然后我又发现这道题貌似可以二分答案来进行check,然后我们就需要去枚举每一次的起始点,并进行模拟,然后加了一个剪枝即如果当前点的前缀和大于当前check的值,说明我们已经在给第一个点第一份菜单时给了他第二份菜单,而这又是不可行的,否则我们

9.5 考试 第二题 通讯题解

问题 B: 通讯 时间限制: 1 Sec  内存限制: 256 MB 题目描述 "这一切都是命运石之门的选择." 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部必须尽快将这个消息通过地下秘密通讯 网络,传达到所有分部. SERN共有N个部门(总部编号为0),通讯网络有M条单向通讯线路,每条线 路有一个固定的通讯花费Ci. 为了保密,消息的传递只能按照固定的方式进行:从一个已知消

2016年下半年信息安全工程师考试真题含答案(下午题)

2016年下半年信息安全工程师考试真题含答案(下午题) https://www.moondream.cn/?p=328 试题一(共20分) 阅读下列说明和图,回答问题1至问题3,将解答填入答题纸的对应栏内. [说明] 研究密码编码的科学称为密码编码学,研究密码破译的科学称为密码分析学,密码编码学和密码分析学共同组成密码学.密码学作为信息安全的关键技术,在信息安全领域有着广泛的应用. [问题1](9分) 密码学的安全目标至少包括哪三个方面?具体内涵是什么? [问题2](3分) 对下列违规安全事件,

2016/1/12 第一题 输出 i 出现次数 第二题 用for循环和if条件句去除字符串中空格 第三题不用endwith 实现尾端字符查询

1 import java.util.Scanner; 2 3 4 public class Number { 5 6 private static Object i; 7 8 /* 9 *第一题 mingrikejijavabu中字符“i” 出现了几次,并将结果输出*/ 10 public static void main(String[] args) { 11 12 String r ="imingrikejijavabi"; 13 14 15 //第一种 截取 16 int a=

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

期末考试编程题 返回 这是期末考试的编程题 温馨提示: 1.本次考试属于Online Judge题目,提交后由系统即时判分. 2.学生可以在考试截止时间之前提交答案,系统将取其中的最高分作为最终成绩. 1 细胞自动机(30分) 题目内容: 这是细胞自动机的非图形版本.细胞自动机是指在一个二维网格内,每一个网格是一个细胞.每个细胞有活和死两种状态. 初始时刻,有些细胞是活的,有些细胞是死的.自动机的每一步,根据每个细胞周围8个格子内的其他细胞的生存情况决定这个细胞下一步是否存活.具体的规则如下:

最后一周第二天训练赛之第二题

试题: B - B Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SPOJ ICODER Description Mathews uses a brand new 16-bit instruction processor. (Yeah i am being sarcastic!). It has one register (say R) and it su

2014百度之星资格赛第二题

Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2560    Accepted Submission(s): 366 Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.

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

题目描述 Description 某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵树. 由于马路上有一些区域要用来建地铁.这些区域用它们在数轴上的起始点和终止点表示.已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分.现在要把这些区域中的树(包括区域端点处的两棵树)移走.你的任务是计算将这些树都移走后,马路上还有多少棵树. 输入输出

05:统计单词数【NOIP2011复赛普及组第二题】

05:统计单词数 总时间限制:  1000ms 内存限制:  65536kB 描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置.注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样