Cod sursa(job #892193)

Utilizator ericptsStavarache Petru Eric ericpts Data 25 februarie 2013 22:53:17
Problema Paduri de multimi disjuncte Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.61 kb
#include <fstream>

using namespace std;

struct oriz
{
    int y;
    int x1,x2;
}o[1002];
int c_o,c_v;
struct vert
{
    int x;
    int y1,y2;
}v[1002];

ifstream in("segmente.in");
ofstream out("segmente.out");

int D[1002][1002];

inline int abs(const int &a)
{
    return a < 0 ? -a : a;
}
inline int min(const int &a,const int &b)
{
    return a < b ? a : b;
}
inline int max(const int &a,const int &b)
{
    return a > b ? a : b;
}
int main()
{
    int n;
    int x1,y1;
    int x2,y2,i,j,k;
    in >> n;
    for(i=1;i<=n;++i)
    {
        in >> x1 >> y1;
        in >> x2 >> y2;
        if(y1 == y2)
        {
            o[++c_o].y = y1;
            o[c_o].x1 = x1;
            o[c_o].x2 = x2;
        }
        else
        {
            v[++c_v].y1 = y1;
            v[c_v].y2 = y2;
            v[c_v].x = x1;
        }
    }
    int a,b;
    int P,Q;
    for(i=1;i<=c_o;++i)
    {
        for(j=1;j<=c_v;++j)
        {
            P = min(abs(o[j].x2 - v[j].x),abs(o[j].x1 - v[j].x));
            if(v[j].x >= o[i].x1 && v[j].x <= o[i].x2)
                P = 0;

            Q = min(abs(o[j].y - v[j].y1),abs(o[j].y - v[j].y2));
            if(o[j].y >= v[j].y1 && o[j].y <= v[j].y2)
                Q = 0;

            D[i][j] = max(P,Q);
        }
    }
    int show = 1<<30;
    int min1 = 1 << 30,min2 = 1 << 30;
    if(c_o < c_v)
    {
        for(i = 1;i <= c_o; ++ i)
            for(j = i + 1;j <= c_o ; ++ j)
            {
                min1 = 1<<30;
                min2 = 1<<30;
                for(k=1;k<= c_v;++ k)
                {
                    P = max(D[i][k],D[j][k]);
                    if(P < min1)
                    {
                        if(min1<min2)
                            min2=min1;
                        min1=P;
                    }
                    else if(P < min2)
                        min2 = P;
                }
                show = min(show,min2);
            }
    }
    else
    {
        for(i=1;i<=c_v;++i)
            for(j=i+1;j<=c_v;++j)
            {
                min1 = 1<<30;
                min2 = 1<<30;
                for(k=1;k<=c_o;++k)
                {
                    P = max(D[k][i],D[k][j]);
                    if(P < min1)
                    {
                        if(min1<min2)
                            min2=min1;
                        min1=P;
                    }
                    else if(P < min2)
                        min2 = P;
                }
                show = min(show,min2);
            }
    }
    out << show << "\n";
}