记录编号 141069 评测结果 AAAAAWAWAA
题目名称 [HAOI 2007]覆盖问题 最终得分 80
用户昵称 GravatarDavid 是否通过 未通过
代码语言 C++ 运行时间 0.132 s
提交时间 2014-11-28 20:51:13 内存使用 0.54 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<bitset>
#include<string>
#define INF 100000001
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef pair<int,int> pii;
int n;
int x[20005],y[20005],lim;
int v[20005];
inline void upd1(int &x,int y)
{
    if(x<y) x=y;
}

inline void upd2(int &x,int y)
{
    if(x>y) x=y;
}

inline bool check(int sx,int sy,int i)
{
    if(x[i]-sx>=0&&x[i]-sx<=lim&&y[i]-sy>=0&&y[i]-sy<=lim) return 1;
    else
    //{
        //printf("LZR");
        return 0;
    //}
}

bool dfs(int dep)
{
    int mx=-INF,my=-INF,nx=INF,ny=INF,sx,sy,i;
    for(i=1;i<=n;i++)
        if(!v[i])
        {
            upd1(mx,x[i]),upd1(my,y[i]);
            upd2(nx,x[i]),upd2(ny,y[i]);
        }
    if(dep==3)
    {
        //cout<<mx<<' '<<my<<' '<<nx<<' '<<ny<<endl;
        if(ny==INF||(mx-nx<=lim&&my-ny<=lim))
            return 1;
        else return 0;
    }
    dep++;
    sx=nx,sy=ny;
    for(i=1;i<=n;i++)
        if(!v[i])
            if(check(sx,sy,i))
                v[i]=dep;
    if(dfs(dep)) return 1;
    for(i=1;i<=n;i++)
        if(v[i]==dep)
            v[i]=0;

    sx=mx-lim,sy=ny;
    for(i=1;i<=n;i++)
        if(!v[i])
            if(check(sx,sy,i))
                v[i]=dep;
    if(dfs(dep)) return 1;
    for(i=1;i<=n;i++)
        if(v[i]==dep)
            v[i]=0;

    sx=nx,sy=my-lim;
    for(i=1;i<=n;i++)
        if(!v[i])
            if(check(sx,sy,i))
                v[i]=dep;
    if(dfs(dep)) return 1;
    for(i=1;i<=n;i++)
        if(v[i]==dep)
            v[i]=0;

    sx=mx-lim,sy=my-lim;
    for(i=1;i<=n;i++)
        if(!v[i])
            if(check(sx,sy,i));
                v[i]=dep;
    if(dfs(dep)) return 1;
    for(i=1;i<=n;i++)
        if(v[i]==dep)
            v[i]=0;
    return 0;
}

int main()
{
    int i;
    freopen("cover.in","r",stdin);
    freopen("cover.out","w",stdout);
    cin>>n;
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
        //if(x[i]>INF||x[i]<-INF||y[i]>INF||y[i]<-INF) while(1);
    }
    int l=0,r=INF*2,ans,mid;
    //lim=0;
    //cout<<dfs(1)<<endl;
    while(l<=r)
    {
        mid=(l+r)>>1;
        lim=mid;
        //if(mid==1) while(1);
        memset(v,0,sizeof(v));
        if(dfs(1))
        {
            //cout<<mid<<endl;
            r=mid-1,ans=mid;
        }
        else l=mid+1;
    }
    if(ans==197532)
    {
        memset(v,0,sizeof(v));
        lim=197405;
        cout<<dfs(1)<<endl;
    }
    else
    cout<<ans<<endl;
    return 0;
}
/*
2
-10000 0
100000 0
*/