Cod sursa(job #1153230)

Utilizator serbanSlincu Serban serban Data 25 martie 2014 12:31:46
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

struct puncte{
int x0,x1,y0,y1;
};
puncte v[4];
int A,P,X0=-1000000001,Y0=-1000000001,X1=1000000001,Y1=1000000001;
int cmp(puncte aa,puncte bb)
{
    if(aa.x0==bb.x0)
    {
        if(aa.y0==bb.y0)
        {
            if(aa.x1==bb.x1)
                return aa.y1<bb.y1;
            return aa.x1<bb.x1;
        }
        return aa.y0<bb.y0;
    }
    return aa.x0<bb.x0;
}

int verificare(int i,int j)
{
    if(v[j].x0>=v[i].x1)
        return 0;
    if(v[j].y0>=v[i].y1)
        return 0;
    return 1;
}
int verificare2(int i,int j)
{
    if(v[j].x0>v[i].x1)
        return 0;
    if(v[j].y0>v[i].y1)
        return 0;
    return 1;
}
void functie(int i,int j)
{
    int cja=max(v[i].x0,v[j].x0);
    int cjo=max(v[i].y0,v[j].y0);
    int csa=min(v[i].x1,v[j].x1);
    int cso=min(v[i].y1,v[j].y1);
    if(verificare2(i,j))
        P=P-(csa-cja+cso-cjo)*2;
    if(verificare(i,j))
    {
        A=A-(csa-cja)*(cso-cjo);
    }
}

int main()
{
    int i,j;
    FILE *f=fopen("reuniune.in","r");
    FILE *g=fopen("reuniune.out","w");
    for(i=1;i<=3;i++)
    {
        fscanf(f,"%d%d%d%d",&v[i].x0,&v[i].y0,&v[i].x1,&v[i].y1);
        A=A+(v[i].x1-v[i].x0)*(v[i].y1-v[i].y0);
        P=P+(v[i].x1-v[i].x0+v[i].y1-v[i].y0)*2;
        X0=max(v[i].x0,X0);
        Y0=max(v[i].y0,Y0);
        X1=min(v[i].x1,X1);
        Y1=min(v[i].y1,Y1);
    }
    sort(v+1,v+4,cmp);
    j=1;
    for(i=1;i<=3;i++)
        if(X0>v[i].x1 || Y0>v[i].y1
           || X1<v[i].x0 || Y1<v[i].y0)
            j=0;
    if(j)
        A=A+(X1-X0)*(Y1-Y0),P=P+(X1-X0+Y1-Y0)*2;
    for(i=1;i<3;i++)
    {
        for(j=i+1;j<=3;j++)
        {
            functie(i,j);
        }
    }
    fprintf(g,"%d %d\n",A,P);
    return 0;
}