显示代码纯文本
/*
Name: 覆盖问题
Copyright:
Author: chairman
Date: 07/10/16 15:54
Description: 由这些树可以确定一个矩形,边上都有树,因为只能用三块,所以必有一块在角上,枚举,然后只剩两块,又是一个矩形,必有一块只能在角上,枚举,最后判断剩下的树是否在一块内
*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 20100
int read()
{
int x,f=1;
char ch;
while(ch=getchar(),!isdigit(ch))if(ch=='-')f=-1;
x=ch-48;
while(ch=getchar(),isdigit(ch))x=x*10+ch-48;
return x*f;
}
void write(int x)
{
if(x<0)x=-x,putchar('-');
int cnt=0;char ch[50];
while(ch[++cnt]=x%10+48,x/=10);
while(putchar(ch[cnt]),--cnt);
putchar('\n');
}
struct node
{
int x,y;
}a[maxn];
bool com(const node & a,const node & b)
{
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
int n,mx[4],mxx[4],mxxx[4],my[4],myy[4],myyy[4],mid;
bool flag[maxn];
bool work()
{
for(int i=1;i<=2;i++)
{
for(int j=1;j<=2;j++)
{
mxxx[1]=0,mxxx[2]=0x7f7f7f7f,myyy[1]=0,myyy[2]=0x7f7f7f7f;
for(int k=1;k<=n;k++)
{
if(!flag[k]&&abs(mxx[i]-a[k].x)>mid||abs(myy[j]-a[k].y)>mid)
{
mxxx[1]=max(a[k].x,mxxx[1]);
mxxx[2]=min(a[k].x,mxxx[2]);
myyy[1]=max(a[k].y,myyy[1]);
myyy[2]=min(a[k].y,myyy[2]);
}
}
if(mxxx[1]-mxxx[2]<=mid&&myyy[1]-myyy[2]<=mid)
{
return 1;
}
}
}
return 0;
}
int main()
{
freopen("cover.in","r",stdin);
freopen("cover.out","w",stdout);
n=read();mx[1]=0,mx[2]=0x7f7f7f7f,my[1]=0,my[2]=0x7f7f7f7f;
for(int i=1;i<=n;i++)
{
a[i].x=read();a[i].y=read();
mx[1]=max(a[i].x,mx[1]);
mx[2]=min(a[i].x,mx[2]);
my[1]=max(a[i].y,my[1]);
my[2]=min(a[i].y,my[2]);
}
int l=1,r=max(mx[1]-mx[2],my[1]-my[2]);
while(l<=r)
{
mid=(l+r)>>1;
bool fl=0;
for(int i=1;i<=2;i++)
{
bool f=0;
for(int j=1;j<=2;j++)
{
memset(flag,0,sizeof flag);
mxx[1]=0,mxx[2]=0x7f7f7f7f,myy[1]=0,myy[2]=0x7f7f7f7f;
for(int k=1;k<=n;k++)
{
if(abs(mx[i]-a[k].x)>mid||abs(my[j]-a[k].y)>mid)
{
mxx[1]=max(a[k].x,mxx[1]);
mxx[2]=min(a[k].x,mxx[2]);
myy[1]=max(a[k].y,myy[1]);
myy[2]=min(a[k].y,myy[2]);
}
else flag[k]=1;
}
if(work())
{
f=1;break;
}
}
if(f==1)
{
fl=1;break;
}
}
if(fl)r=mid-1;
else l=mid+1;
}
write(r+1);
fclose(stdin);
fclose(stdout);
}