【bzoj1052】【HAOI2007】【覆盖问题】【贪心】

原创 2015年11月21日 17:10:19

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

题解:首先二分L。

           对于判断,首先用一个最小的矩阵去覆盖树苗。显然塑料薄膜应该放到矩阵的角上。

           然后我们先暴力放两个薄膜,然后判断剩下的点能否放到一个薄膜里。

代码:

#include<iostream>
#include<cstdio>
#define N 20010
#define INF 1000000000
using namespace std;
int n,l,r,mid,ans;
struct use{int x[N],y[N],mx;}p,q;
void del(use &t,int x,int y,int xx,int yy){
 int n=t.mx;t.mx=0;
 for (int i=1;i<=n;i++)if (t.x[i]<x||t.x[i]>xx||t.y[i]<y||t.y[i]>yy){t.x[++t.mx]=t.x[i];t.y[t.mx]=t.y[i];}
}
void cal(use &t,int kind,int l){
  int x(INF),xx(-INF),y(INF),yy(-INF);
  for (int i=1;i<=t.mx;i++){
    x=min(x,t.x[i]);y=min(y,t.y[i]);xx=max(xx,t.x[i]);yy=max(yy,t.y[i]);
    }
  if (kind==1)del(t,x,y,x+l,y+l);if (kind==2)del(t,xx-l,y,xx,y+l);
  if (kind==3)del(t,x,yy-l,x+l,yy);if (kind==4)del(t,xx-l,yy-l,xx,yy);
}
bool check(int v){  
  for (int i=1;i<=4;i++)
   for (int j=1;j<=4;j++){
    int x(INF),xx(-INF),y(INF),yy(-INF);
      for (int k=1;k<=n;k++) q.x[k]=p.x[k],q.y[k]=p.y[k];
       q.mx=n;cal(q,i,v);cal(q,j,v);
      for (int k=1;k<=q.mx;k++){x=min(x,q.x[k]);y=min(y,q.y[k]);xx=max(xx,q.x[k]);yy=max(yy,q.y[k]);}
      if (xx-x<=v&&yy-y<=v) return true;
   }
  return false;
}
int main(){
  scanf("%d",&n);p.mx=n;l=1;r=INF;
  for (int i=1;i<=n;i++)  scanf("%d%d",&p.x[i],&p.y[i]);     
  while (l<=r){mid=(l+r)>>1;if (check(mid)){ans=mid;r=mid-1;}else l=mid+1;}
  printf("%d\n",ans);
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

BZOJ 1052: [HAOI2007]覆盖问题 二分, 贪心

Description   某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄 膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑...

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

Description 某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄...
  • thy0311
  • thy0311
  • 2015年07月14日 13:54
  • 183

[BZOJ1052][HAOI2007]覆盖问题(二分+dfs)

题目描述传送门题解可以发现一个非常重要的性质:如果我们确定了在一定范围内有一些点,然后用边长为常数k(...

BZOJ1052【HAOI2007】覆盖问题

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1052 【分析】 先扫出覆盖所有点的最小矩形,那么放置的正方形的顶点与该矩形的顶点重合时...

bzoj 1052: [HAOI2007]覆盖问题

Description 某人在山上种了N棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他决定用3个L*L的正方形塑料薄...
  • lqybzx
  • lqybzx
  • 2014年11月30日 19:56
  • 554

【BZOJ1052】【HAOI2007】覆盖问题 二分+深搜check

题解:乱搞。 就是搜每个正方形的位置(一定在一个角,证明自己想想吧,很容易但是不算太好写) 代码: #include #include #include #include #de...
  • Vmurder
  • Vmurder
  • 2015年01月11日 08:25
  • 948

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

题目大意:给定n个点,用三个边长相同的正方形覆盖所有点,要求正方形边界与坐标轴垂直,求正方形边长的最小值 最大值最小,很明显二分答案 但是验证是个问题 考虑只有三个正方形,故用一个最小矩形覆盖这...
  • PoPoQQQ
  • PoPoQQQ
  • 2014年10月31日 08:45
  • 1147

[BZOJ 1052] 覆盖问题 二分+搜索(DFS)+贪心

题目传送门:【BZOJ 1052】题目大意:某人在山上种了 N 棵小树苗。冬天来了,温度急速下降,小树苗脆弱得不堪一击,他决定用 3 个 L * L 的正方形塑料薄膜将小树遮起来。 我们将山建立一个...
  • ArcCCcp
  • ArcCCcp
  • 2017年07月10日 20:13
  • 73

BZOJ 1046 [HAOI2007]上升序列 动态规划+贪心

Description   对于一个给定的S={a1,a2,a3,…,an},若有P={ax1,ax2,ax3,…,axm},满足(x1 2 出S序列,给出若干询问。对于第i个询问,求出...

BZOJ 1052 覆盖问题题解

1052: [HAOI2007]覆盖问题Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1912  Solved: 895[Submit][Status...
  • NOIAu
  • NOIAu
  • 2017年07月05日 23:37
  • 202
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【bzoj1052】【HAOI2007】【覆盖问题】【贪心】
举报原因:
原因补充:

(最多只允许输入30个字)