Cod sursa(job #1088138)

Utilizator serbanSlincu Serban serban Data 20 ianuarie 2014 10:52:27
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.17 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

struct dreptunghi{
long long x0,x1,y1,y0;
};
dreptunghi P[4];

long long auxx0,auxx1,auxy0,auxy1;
long long A,B;
int reuniune(long long xx0,long long yy0,long long xx1,long long yy1,int ok)
{
    long long dif,fid;
    dif=xx0-xx1;
    if(dif<0) dif=dif*(-1);
    fid=yy0-yy1;
    if(fid<0) fid=fid*(-1);
    if(dif!=0 && fid!=0)
    {
        if(ok==0)
            B=B+dif*2+fid*2;
        else B=B-dif*2-fid*2;
    }
    else
    {
        if(ok==0)
            B=B+dif+fid;
        else B=B-dif-fid;
    }
    return dif*fid;
}
int intersectie(int i, int j)
{
    if(P[i].x0<P[j].x0)
        auxx0=P[j].x0;
    else auxx0=P[i].x0;
    if(P[i].y0<P[j].y0)
        auxy0=P[j].y0;
    else auxy0=P[i].y0;
    if(P[i].x1<P[j].x1)
        auxx1=P[i].x1;
    else auxx1=P[j].x1;
    if(P[i].y1<P[j].y1)
        auxy1=P[i].y1;
    else auxy1=P[j].y1;

    if(auxx0<=auxx1 && auxy0<=auxy1)
        return reuniune(auxx0,auxy0,auxx1,auxy1,1);
    else return 0;
}

int main()
{
    int i,j;
    freopen("reuniune.in","r",stdin);
    freopen("reuniune.out","w",stdout);
    for(i=1;i<=3;i++)
    {
        cin>>P[i].x0>>P[i].y0>>P[i].x1>>P[i].y1;
        if(min(P[i].x0,P[i].x1)==P[i].x1)
        {
            j=P[i].x1;
            P[i].x1=P[i].x0;
            P[i].x0=j;
        }
        if(min(P[i].y0,P[i].y1)==P[i].y1)
        {
            j=P[i].y1;
            P[i].y1=P[i].y0;
            P[i].y0=j;
        }
        A=A+reuniune(P[i].x0,P[i].y0,P[i].x1,P[i].y1,0);
    }
    //fara intersectii
    for(i=1;i<3;i++)
    {
        for(j=i+1;j<=3;j++)
        {
            A=A-intersectie(i,j);
        }
    }
    //fara intersectia la 3
    for(i=1;i<=3;i++)
    {
        if(P[i].x0>auxx0)
            auxx0=P[i].x0;
        if(P[i].y0>auxy0)
            auxy0=P[i].y0;
        if(P[i].x1<auxx1)
            auxx1=P[i].x1;
        if(P[i].y1<auxy1)
            auxy1=P[i].y1;
    }
    if(auxx0<auxx1 && auxy0<auxy1)
    {
        A=A+reuniune(auxx0,auxy0,auxx1,auxy1,0);
    }
    cout<<A<<" "<<B;
    cout<<"\n";
    return 0;
}