记录编号 316965 评测结果 AAAAAAAAAA
题目名称 1312.[HAOI 2007]覆盖问题 最终得分 100
用户昵称 Hzoi_chairman 是否通过 通过
代码语言 C++ 运行时间 0.126 s
提交时间 2016-10-07 15:46:06 内存使用 0.48 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 20100
#define ll long long
ll read()
{
	ll 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(ll 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()
{//cout<<mid<<endl;
	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]);
				}
				//else flag[k]=1;
			}
			if(mxxx[1]-mxxx[2]<=mid&&myyy[1]-myyy[2]<=mid)
			{//cout<<mxxx[1]-mxxx[2]<<' '<<mid<<endl;
				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]);
	}
	//sort(a+1,a+1+n,com);
	int l=1,r=max(mx[1]-mx[2],my[1]-my[2]);//cout<<r<<endl;
	while(l<=r)
	{
		mid=(l+r)>>1;//cout<<mid<<' '<<l<<' '<<r<<endl;
		
		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);//while(1);
//	system("pause");
	fclose(stdin);
	fclose(stdout);
}