比赛 4043级NOIP2022欢乐赛1st 评测结果 AAAAAAAAAA
题目名称 覆盖问题 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.158 s
代码语言 C++ 内存使用 3.94 MiB
提交时间 2022-10-28 21:38:21
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=20000+5;
const ll inf=0x3f3f3f3f3f3f;
int n;
struct sdf{
	ll x,y;
}q[5][N],q1[N],q2[N];
int cnt[5]={0};
bool cmp1(sdf a,sdf b){
	if (a.x!=b.x)return a.y>b.y;
	return a.x<b.x;
}
bool cmp2(sdf a,sdf b){
	if (a.y!=b.y)return a.x<b.x;
	return a.y>b.y;
}
bool check(ll l,int k){
	if (k==0){
		return cnt[0]==0;
	}
	ll mxx=-inf,mnx=inf,mxy=-inf,mny=inf;
	bool yes=0;
	for (int i=1;i<=cnt[k];i++){
		mxx=max(mxx,q[k][i].x);
		mnx=min(mnx,q[k][i].x);
		mxy=max(mxy,q[k][i].y);
		mny=min(mny,q[k][i].y);
	}
	cnt[k-1]=0;
	for (int i=1;i<=cnt[k];i++){
		if (q[k][i].x>mxx||q[k][i].x<mxx-l||q[k][i].y>mxy||q[k][i].y<mxy-l){
			q[k-1][++cnt[k-1]]=q[k][i];	
		}
	}
	yes|=check(l,k-1);
	if (yes==1)return 1;
	cnt[k-1]=0;
	for (int i=1;i<=cnt[k];i++){
		if (q[k][i].x<mnx||q[k][i].x>mnx+l||q[k][i].y>mxy||q[k][i].y<mxy-l){
			q[k-1][++cnt[k-1]]=q[k][i];	
		}
	}
	yes|=check(l,k-1);
	if (yes==1)return 1;
	cnt[k-1]=0;
	for (int i=1;i<=cnt[k];i++){
		if (q[k][i].x>mxx||q[k][i].x<mxx-l||q[k][i].y<mny||q[k][i].y>mny+l){
			q[k-1][++cnt[k-1]]=q[k][i];	
		}
	}
	yes|=check(l,k-1);
	if (yes==1)return 1;
	cnt[k-1]=0;
	for (int i=1;i<=cnt[k];i++){
		if (q[k][i].x<mnx||q[k][i].x>mnx+l||q[k][i].y<mny||q[k][i].y>mny+l){
			q[k-1][++cnt[k-1]]=q[k][i];	
		}
	}
	yes|=check(l,k-1);
	if (yes==1)return 1;
	return 0;
}
int main(){
	freopen ("cover.in","r",stdin);
	freopen ("cover.out","w",stdout);
	scanf("%d",&n);cnt[3]=n;
	for (int i=1;i<=n;i++){
		scanf("%lld%lld",&q[3][i].x,&q[3][i].y);
	}
	ll l=1,r=2000000000;
	while(l<r){
		ll mid=(l+r)/2;
		if (check(mid,3))r=mid;
		else l=mid+1;
	}
	printf("%lld\n",l);
	return 0;
}