Cod sursa(job #2088520)

Utilizator 1000Sabin Ilegitim 1000 Data 15 decembrie 2017 13:52:51
Problema Reuniune Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <cmath>
using namespace std;
ifstream cin("reuniune.in");
ofstream cout("reuniune.out");
struct drept{
    long long x1, y1, x2, y2, a, p;
} v[5];
drept in(drept a, drept b);
long long arie(drept a);
long long per(drept a);
int main()
{
    for(int i=1; i<=3; i++)
        cin>>v[i].x1>>v[i].y1>>v[i].x2>>v[i].y2;

    long long A=arie(v[1])+arie(v[2])+arie(v[3]);

    drept d1, d2, d3;
    d1=in(v[1], v[2]);
    d2=in(v[2], v[3]);
    d3=in(v[1], v[3]);

    A-=(arie(d1)+arie(d2)+arie(d3));
    drept d4, d5;
    d4=in(d2, d3);
    d5=in(d1, d4);
    A+=arie(d5);

    cout<<A<<" ";

    long long P=per(v[1])+per(v[2])+per(v[3]);
    P-=(per(d1)+per(d2)+per(d3));
    P+=per(d5);

    cout<<P;

    return 0;
}

drept in(drept a, drept b)
{
    drept c;
    c.x1=max(a.x1, b.x1);
    c.x2=min(a.x2, b.x2);
    c.y1=max(a.y1, b.y1);
    c.y2=min(a.y2, b.y2);

    if(c.x1>c.x2)
        c.x1=c.x2;
    if(c.y1>c.y2)
        c.y1=c.y2;

    return c;
}

long long arie(drept a)
{
    return abs((a.x2-a.x1)*(a.y2-a.y1));
}

long long per(drept a)
{
    return 2*(abs(a.x2-a.x1)+abs(a.y2-a.y1));
}