比赛 |
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;
}