BZOJ1052[HAOI2007]覆盖问题

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

题解:

贪心题,虽然我并不能完备地证明。

把没有覆盖的树苗所在的最小矩形区域表示出来,则一定在矩形的四个角上选择一个作为覆盖区域。重复操作3次,若成功覆盖,则可行。

代码:

 1 uses math;
 2 var
 3   i,j,k,l,r,n,m,x1,x2,y1,y2,mid,ans:longint;
 4   a:array[0..20001,0..2]of longint;
 5 function ss(x,le:longint):boolean;
 6 var i,j,k,l,x1,x2,y1,y2:longint;
 7   aa:array[0..20001]of longint;
 8 begin
 9   l:=0;
10   for i:=1 to n do aa[i]:=a[i,0];
11   x1:=maxlongint; y1:=maxlongint; x2:=-x1; y2:=-y1;
12   for i:=1 to n do
13   if aa[i]=0 then
14   begin
15     x1:=min(x1,a[i,1]);
16     y1:=min(y1,a[i,2]);
17     x2:=max(x2,a[i,1]);
18     y2:=max(y2,a[i,2]);
19   end;
20   if(x1=maxlongint)or(y1=maxlongint)then exit(true);
21   if x=0 then
22   begin
23     if(y2-y1<=le)and(x2-x1<=le)then exit(true);
24     exit(false);
25   end;
26   j:=x1; k:=y1;
27   for i:=1 to n do
28   if a[i,0]=0 then
29   if(a[i,1]>=j)and(a[i,1]<=j+le)and(a[i,2]>=k)and(a[i,2]<=k+le)
30   then a[i,0]:=1;
31   if ss(x-1,le)then l:=1;
32   for i:=1 to n do a[i,0]:=aa[i];
33   j:=x1; k:=y2-le;
34   for i:=1 to n do
35   if a[i,0]=0 then
36   if(a[i,1]>=j)and(a[i,1]<=j+le)and(a[i,2]>=k)and(a[i,2]<=k+le)
37   then a[i,0]:=1;
38   if ss(x-1,le)then l:=1;
39   for i:=1 to n do a[i,0]:=aa[i];
40   j:=x2-le; k:=y2-le;
41   for i:=1 to n do
42   if a[i,0]=0 then
43   if(a[i,1]>=j)and(a[i,1]<=j+le)and(a[i,2]>=k)and(a[i,2]<=k+le)
44   then a[i,0]:=1;
45   if ss(x-1,le)then l:=1;
46   for i:=1 to n do a[i,0]:=aa[i];
47   j:=x2-le; k:=y1;
48   for i:=1 to n do
49   if a[i,0]=0 then
50   if(a[i,1]>=j)and(a[i,1]<=j+le)and(a[i,2]>=k)and(a[i,2]<=k+le)
51   then a[i,0]:=1;
52   if ss(x-1,le)then l:=1;
53   for i:=1 to n do a[i,0]:=aa[i];
54   if l=1 then exit(true);
55   exit(false);
56 end;
57 begin
58   readln(n);
59   for i:=1 to n do
60   begin
61     readln(a[i,1],a[i,2]);
62   end;
63   l:=1; r:=maxlongint-1; ans:=maxlongint;
64   while l<=r do
65   begin
66     mid:=(l+r)div 2;
67     if ss(2,mid)then begin ans:=mid; r:=mid-1; end
68     else l:=mid+1;
69   end;
70   writeln(ans);
71 end.

时间: 2024-11-03 05:31:30

BZOJ1052[HAOI2007]覆盖问题的相关文章

bzoj1052: [HAOI2007]覆盖问题(二分+构造)

貌似又写出了常数挺优(至少不劣)的代码>v< 930+人AC #49 写了个O(nlogn)貌似比一些人O(n)还快2333333 这题还是先二分答案,check比较麻烦 显然正方形一定以最左上或最右上或最左下或最右下的点为端点来盖,盖了一个之后再拿一个枚举剩下的点作为四个端点来盖,最后一个直接判断剩下的点能不能一次性盖就好了 #include<iostream> #include<cstring> #include<cstdlib> #include<

【BZOJ 1052】 [HAOI2007]覆盖问题

1052: [HAOI2007]覆盖问题 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1095  Solved: 500 [Submit][Status] Description 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄膜将小树遮起来.我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个L*

「二分答案 + 搜索」[HAOI2007]覆盖问题

[HAOI2007]覆盖问题 题目链接:[HAOI2007]覆盖问题 题目大意 给你\(n\)个坐标,再给你3个\(l \times l\)的矩阵,让你用这些矩阵去包含这些点,要求是将所有点都包含,我们要求\(l\)的最小值 题目题解 想到二分了,不过没想到怎么爆搜 看了下题解,妙啊妙啊,牛逼 每次二分一个 \(l\) 值作为我们想要的矩阵边长,然后由树的坐标我们可能可以找到比原平面直角坐标系更小的一个坐标系,我们在新的坐标系上进行操作就可以了,但怎么进行操作呢?我们如果想尽可能的缩小新坐标系的

【题解】覆盖问题 BZOJ1052 HAOI2007

题目描述 某人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个LL的正方形塑料薄膜将小树遮起来.我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个LL的正方形的边要求平行与坐标轴,一个点如果在正方形的边界上,也算作被覆盖.当然,我们希望塑料薄膜面积越小越好,即求L最小值. 输入输出 input第一行有一个正整数N,表示有多少棵树.接下来有N行,第i+1行有2个整数Xi,Yi

【题解】覆盖问题 BZOJ1052 HAOI2007 二分

题目描述 某 人在山上种了N棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用 3个LL的正方形塑料薄膜将小树遮起来.我们不妨将山建立一个平面直角坐标系,设第i棵小树的坐标为(Xi,Yi),3个LL的正方形的边要求平行与坐标 轴,一个点如果在正方形的边界上,也算作被覆盖.当然,我们希望塑料薄膜面积越小越好,即求L最小值. 输入输出 input第一行有一个正整数N,表示有多少棵树.接下来有N行,第i+1行有2个整数Xi

BZOJ 1052 HAOI2007 覆盖问题 二分答案+DFS

题目大意:给定n个点,用三个边长相同的正方形覆盖所有点,要求正方形边界与坐标轴垂直,求正方形边长的最小值 最大值最小,很明显二分答案 但是验证是个问题 考虑只有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有一个在角上 若有四个正方形该结论不成立 于是我们采用DFS的方式 每次用一个最小的矩形覆盖所有的点,枚举矩形的四个角 将正方形填进去 由于最大深度是3,所以时间上完全可以承受 #include<cstdio> #include<cstring> #include<io

【BZOJ】1052: [HAOI2007]覆盖问题(贪心)

http://www.lydsy.com/JudgeOnline/problem.php?id=1052 首先膜拜题解orz,表示只能想到二分... 贪心就是每一次找到一个最小的能包围所有点的矩阵,然后枚举四个角放正方形. 不会证QAQ 然后被sb错吊打了半小时... 又是自以为的开全局变量没想到局部改变... #include <cstdio> #include <cstring> #include <cmath> #include <string> #i

BZOJ 1052 HAOI2007 覆盖问题 二分法答案+DFS

标题效果:特定n点.涵盖所有的点与同方三面.斧头要求方垂直边界,最小平方的需求方长值 最大值至少.答案是很明显的二分法 但验证是一个问题 考虑仅仅有三个正方形,故用一个最小矩形覆盖这三个正方形时至少有一个在角上 若有四个正方形该结论不成立 于是我们採用DFS的方式 每次用一个最小的矩形覆盖全部的点,枚举矩形的四个角 将正方形填进去 因为最大深度是3,所以时间上全然能够承受 #include<cstdio> #include<cstring> #include<iostream

P2218 [HAOI2007]覆盖问题

传送门 首先可以想到二分答案,然后考虑判断 注意到所有点的外包矩形的四条边一定要被覆盖到,而正方形只有 $3$ 个,所以一定有一个正方形在角落 考虑爆搜,枚举正方形在当前外包矩形的那个角,然后对剩下的点的外包矩形继续这样搞 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; ty