Cod sursa(job #1238883)

Utilizator george_stelianChichirim George george_stelian Data 7 octombrie 2014 21:22:46
Problema Ograzi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <cstdio>
#include <cstring>

using namespace std;

const int mod=1<<20,dirx[9]={0,-1,-1,0,1,1,1,0,-1},diry[9]={0,0,1,1,1,0,-1,-1,-1};
struct punct
{
    int x,y;
}v[1000000];
int v1[mod],n,w,h,nr;
char pars[10000000];

inline int normx(int x)
{
    return x/w+1;
}
inline int normy(int y)
{
    return y/h+1;
}
inline int inc(int &a)
{
    if(++a==mod) a=0;
}
inline void hash_insert(int i)
{
    int a=(normx(v[i].x)*23+1LL*normy(v[i].y)*997)%mod;
    for(;v1[a];inc(a));
    v1[a]=i;
}
inline int hash_find(int x,int y)
{
    int a=(x*23+1LL*y*997)%mod;
    for(;v1[a] && (normx(v[v1[a]].x)!=x || normy(v[v1[a]].y)!=y);inc(a));
    return v1[a];
}
inline int inter(int i,int x,int y)
{
    if(v[i].x<x && v[i].x+w>x && v[i].y<y && v[i].y+h>y) return 1;
    return 0;
}
inline int read()
{
    int x=0;
    for(;pars[nr]>='0' && pars[nr]<='9';nr++) x=x*10+pars[nr]-'0';
    nr++;
    return x;
}

int main()
{
    freopen("harta2.in", "r", stdin);
    freopen("harta2.out", "w", stdout);
    fread(pars,1,10000000,stdin);
    n=read();
    for(int i=1;i<=n;i++)
    {
        v[i].x=read()*1000;
        v[i].y=read()*1000;
    }
    int st=999,dr=1000000000;
    while(st<=dr)
    {
        memset(v1,0,sizeof(v1));
        int mid=(st+dr)/2,ok=0;
        w=3*mid;h=mid;
        hash_insert(1);
        for(int i=2;i<=n;i++)
        {
            int x=normx(v[i].x),y=normy(v[i].y),a;
            for(int j=0;j<9;j++)
            {
                if(x+dirx[j]<1 || y+diry[j]<1) a=0;
                else a=hash_find(x+dirx[j],y+diry[j]);
                if(a && inter(a,v[i].x,v[i].y) || inter(a,v[i].x+w,v[i].y) || inter(a,v[i].x,v[i].y+h) || inter(a,v[i].x+w,v[i].y+h)) {ok=1;break;}
            }
            if(!ok) hash_insert(i);
            else break;
        }
        if(ok) dr=mid-1;
        else st=mid+1;
    }
    printf("%.3lf",(double)dr/1000.0);
    return 0;
}