Cod sursa(job #1008859)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 11 octombrie 2013 23:45:47
Problema Substr Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.59 kb
#include <fstream>
#include <cstring>
#include <cstdlib>

#define In "patrate.in"
#define Out "patrate.out"
#define Nmax 50013
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

using namespace std ;

struct point
{
    int x,y;
};

int xmax,xmin, ymax, ymin;
point a[Nmax];
bool Deleted[Nmax];
int n, sol;
char *buffer;
inline void Read(int &x)
{
    while(*buffer<'0' || '9' < *buffer )buffer++;
    x = 0;
    while('0'<=*buffer && *buffer <='9')
        x = x*10+*buffer-'0',buffer++;
}
inline void Init_Buffer()
{
    ifstream fin(In);
    fin.seekg(0,ios::end);
    int fs = fin.tellg();
    buffer = (char*)malloc(fs);
    fin.seekg(0,ios::beg);
    fin.getline(buffer,fs,0);
    fin.close();
}
inline void Read()
{
    Read(n);
    xmin = ymin = Nmax;
    for(int i = 1;i <= n; ++i)
        Read(a[i].x),Read(a[i].y),
        xmax = max(xmax,a[i].x),
        ymax = max(ymax,a[i].y),
        xmin = min(xmin,a[i].x),
        ymin = min(ymin,a[i].y);
}

inline void Change(const bool flag,int &newxmax,int &newxmin,int &newymax,int &newymin,const int Xmin,const int Ymin,const int Xmax,const int Ymax)
{
    newxmax = 0,newxmin = Nmax,newymax = 0,newymin = Nmax;
    int i;
    for(i = 1;i <= n; ++i)
    {
        if(flag==1)
            Deleted[i] = 0;
        if(!Deleted[i])
        {
            if(Xmin <= a[i].x && a[i].x <= Xmax && Ymin <= a[i].y && a[i].y <= Ymax)
                Deleted[i] = 1;
            else
                newxmax = max(newxmax,a[i].x),
                newymax = max(newymax,a[i].y),
                newxmin = min(newxmin,a[i].x),
                newymin = min(newymin,a[i].y);
        }
    }
}

inline bool Verif(const int k)
{

    int newxmax, newxmin, newymax, newymin;
    int xxmax, xxmin, yymax, yymin;

    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymin,xmax,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymin,newxmin+k,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymin,xmax,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymax-k,newxmin+k,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymin,xmax,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmax-k,newymax-k,newxmax,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymin,xmax,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmax-k,newymin,newxmax,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;




    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymax-k,xmax,ymax);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymin,newxmin+k,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymax-k,xmax,ymax);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymax-k,newxmin+k,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymax-k,xmax,ymax);
    Change(0,xxmax,xxmin,yymax,yymin,newxmax-k,newymax-k,newxmax,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmax-k,ymax-k,xmax,ymax);
    Change(0,xxmax,xxmin,yymax,yymin,newxmax-k,newymin,newxmax,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmin,ymin,xmin+k,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymin,newxmin+k,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmin,ymin,xmin+k,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymax-k,newxmin+k,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmin,ymin,xmin+k,ymin+k);
    Change(0,xxmax,xxmin,yymax,yymin,newxmax-k,newymax-k,newxmax,newymax);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    Change(1,newxmax,newxmin,newymax,newymin,xmin,ymax-k,xmin+k,ymax);
    Change(0,xxmax,xxmin,yymax,yymin,newxmin,newymin,newxmin+k,newymin+k);
    if(yymax-yymin<=k && xxmax-xxmin<=k) return true;


    return 0;
}

inline void Solve()
{
    int Left = 1,Right = max(xmax-xmin,ymax-ymin), Middle;
    while(Left <= Right)
    {
        Middle = (Left+Right)>>1;
        if(Verif(Middle))
            sol = Middle,
            Right = Middle - 1;
        else
            Left = Middle + 1;
    }
}

inline void Write()
{
    ofstream g(Out);
    g<<sol<<"\n";
    g.close();
}

int main()
{
    Init_Buffer();
    Read();
    if(n>3)
        Solve();
    else
        sol = 0;
    Write();
    return 0;
}