Cod sursa(job #379447)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 1 ianuarie 2010 20:18:20
Problema Reuniune Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.03 kb
#include<stdio.h>
#define INF 2000000009
#define ll long long
struct cord
{
    int x,y;
};
int per123,per12,per13,per23,per1,per2,per3,nri;
cord p1 , p2 , p3 , p4 , p5 , p6 , p7 , p8;
ll A1 , A2 , A3 , A4 , A5 , A6 , A7;
ll per,At,l,L;
int min (int a,int b,int c)
{
    if(a<b)
        b=a;
    if(c<b)
        b=c;
    return b;
}

int max (int a,int b,int c)
{
    if(a>b)
        b=a;
    if(c>b)
        b=c;
    return b;
}
ll perim(cord pc1 , cord pc2 , cord pc3 , cord pc4)
{
    int stj1,stj2,drs1,drs2;
    ll l,L;
    stj1=min(pc1.x,pc3.x,INF);
    stj2=min(pc1.y,pc3.y,INF);
    ///////////
    drs1=max(pc2.x,pc4.x,-INF);
    drs2=max(pc2.y,pc4.y,-INF);
    ///////////
    l=drs1-stj1;
    L=drs2-stj2;
    return (2*(l+L));
}
ll ainter (int v1,int v2,int v3,int v4,int v5,int v6,int v7,int v8)
{
    int oxs,oxd,oys,oyd;
    ll A;
    oxs=max(v1,v5,-INF);
    oxd=min(v3,v7,INF);
    if(oxs>=oxd)
        return 0;
    oys=max(v2,v6,-INF);
    oyd=min(v4,v8,INF);
    if(oys>=oyd)
        return 0;
    A=(ll)(oxd-oxs)*(oyd-oys);
    return A;
}

ll superinter()
{
    int oxs,oxd,oys,oyd;
    ll A;
    oxs=max(p1.x,p3.x,-INF);
    oxd=min(p2.x,p4.x,INF);
    if(oxs>=oxd)
        return 0;
    oys=max(p1.y,p3.y,-INF);
    oyd=min(p2.y,p4.y,INF);
    
    if(oys>=oyd)
        return 0;
    A=ainter(oxs , oys , oxd , oyd , p5.x , p5.y , p6.x , p6.y);
    return A;
}

int main ()
{
    int stj1,stj2,drs1,drs2;
    freopen("reuniune.in","r",stdin);
    freopen("reuniune.out","w",stdout);
    scanf("%d%d%d%d%d%d%d%d%d%d%d%d",&p1.x,&p1.y,&p2.x,&p2.y,&p3.x,&p3.y,&p4.x,&p4.y,&p5.x,&p5.y,&p6.x,&p6.y);
    ///////////////
    stj1=min(p1.x,p3.x,p5.x);
    stj2=min(p1.y,p3.y,p5.y);
    ///////////
    drs1=max(p2.x,p4.x,p6.x);
    drs2=max(p2.y,p4.y,p6.y);
    ///////////
    l=drs1-stj1;
    L=drs2-stj2;
    per123=2*(l+L);
    /////////////////
    
    l=p2.x-p1.x;L=p2.y-p1.y;
    per1=2*(l+L);
    
    l=p4.x-p3.x;L=p4.y-p3.y;
    per2=2*(l+L);
    
    l=p6.x-p5.x;L=p6.y-p5.y;
    per3=2*(l+L);
    /////////////////
    per12=perim(p1,p2,p3,p4);
    per13=perim(p1,p2,p5,p6);
    per23=perim(p3,p4,p5,p6);
    
    /////////////////
    A1=(ll)(p2.x-p1.x)*(p2.y-p1.y);
    A2=(ll)(p4.x-p3.x)*(p4.y-p3.y);
    A3=(ll)(p6.x-p5.x)*(p6.y-p5.y);
    A4=ainter(p1.x , p1.y , p2.x , p2.y , p3.x , p3.y , p4.x , p4.y);
    A5=ainter(p1.x , p1.y , p2.x , p2.y , p5.x , p5.y , p6.x , p6.y);
    A6=ainter(p3.x , p3.y , p4.x , p4.y , p5.x , p5.y , p6.x , p6.y);
    A7=superinter();
    At=A1+A2+A3-A4-A5-A6+A7;
    ////////////////
    if(A4)
        nri++;
    if(A5)
        nri++;
    if(A6)
        nri++;
    if(nri>=2)
        per=per123;
    else
        if(nri==0)
            per=per1+per2+per3;
        else
        {
            if(A4)
                per=per12+per3;
            if(A5)
                per=per13+per2;
            if(A6)
                per=per23+per1;
        }
    printf("%lld %lld\n",At,per);
    return 0;
}