Cod sursa(job #2071273)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 20 noiembrie 2017 15:47:34
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<cstdio>
#include<algorithm>
using namespace std;

struct STR{
    int l1,l2,c1,c2;
}inter[5];

int x1[5],y[5],x2[5],y2[5];

STR intersectie(int ind1, int ind2){
    STR nr;
    int a1,b1,a2,b2;
    a1=max(x1[ind1], x1[ind2]);
    a2=min(x2[ind1], x2[ind2]);
    b1=max(y[ind1], y[ind2]);
    b2=min(y2[ind1], y2[ind2]);
    nr.l1=a1;
    nr.c1=b1;
    nr.l2=a2;
    nr.c2=b2;
    return nr;
}

bool contradictie(int ind){
    if(inter[ind].l1>inter[ind].l2)
        return true;
    if(inter[ind].c1>inter[ind].c2)
        return true;
    return false;
}

void initializare(int ind){
    inter[ind].l1=inter[ind].l2=inter[ind].c1=inter[ind].c2=0;
}

long long produs(STR nr){
    long long s;
    s=1LL*(nr.l2-nr.l1)*(nr.c2-nr.c1);
    return s;
}

long long suma(STR nr){
    long long s=0;
    s=1LL*2*(nr.l2-nr.l1+nr.c2-nr.c1);
    return s;
}

int main(){
    freopen("reuniune.in","r",stdin);
    freopen("reuniune.out","w",stdout);
    long long arie=0,perimetru=0;
    for(int k=1;k<=3;k++)
        scanf("%d%d%d%d", &x1[k], &y[k], &x2[k], &y2[k]);
    inter[0]=intersectie(1, 2);
    inter[1]=intersectie(1, 3);
    inter[2]=intersectie(2, 3);
    inter[3].l1=max(x1[1], max(x1[2], x1[3]));
    inter[3].c1=max(y[1], max(y[2], y[3]));
    inter[3].l2=min(x2[1], min(x2[2], x2[3]));
    inter[3].c2=min(y2[1], min(y2[2], y2[3]));
    for(int k=0;k<4;k++)
        if(contradictie(k)){
            initializare(k);
            initializare(3);
        }
    for(int k=1;k<=3;k++){
        arie+=1LL*(x2[k]-x1[k])*(y2[k]-y[k]);
        perimetru+=1LL*2*(x2[k]-x1[k]+y2[k]-y[k]);
    }
    arie-=produs(inter[0])+produs(inter[1])+produs(inter[2])-produs(inter[3]);
    perimetru-=suma(inter[0])+suma(inter[1])+suma(inter[2])-suma(inter[3]);
    printf("%lld %lld", arie, perimetru);
    return 0;
}