Cod sursa(job #2450519)

Utilizator CharacterMeCharacter Me CharacterMe Data 23 august 2019 16:29:56
Problema Reuniune Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.9 kb
#include <bits/stdc++.h>
using namespace std;
///
typedef long long ll;
struct Rectangle{
    ll x1, x2, y1, y2;
    ll width, height;
    void cn();
};
///
Rectangle r1, r2, r3, r12, r23, r13, r123;
ll perimeter, area;
///
void read();
void solve();
void write();
Rectangle unite(Rectangle ra, Rectangle rb);
///
int main()
{
    read();
    solve();
    write();
    return 0;
}
void read(){
    freopen("reuniune.in", "r", stdin);
    r1.cn(); r2.cn(); r3.cn();
    fclose(stdin);
}
void solve(){
    area=perimeter=0LL;
    r12=unite(r1, r2);
    r13=unite(r1, r3);
    r23=unite(r2, r3);
    r123=unite(r12, r3);
    area+=r1.height*r1.width+r2.height*r2.width+r3.height*r3.width;
    perimeter+=2*(r1.height+r1.width+r2.height+r2.width+r3.height+r3.width);
    area=area-r12.height*r12.width-r13.width*r13.height-r23.width*r23.height;
    perimeter=perimeter-2*(r12.width+r12.height+r13.width+r13.height+r23.width+r23.height);
    if(!r12.width && r12.height>0) perimeter=perimeter-r12.height;
    if(r12.width>0 && !r12.height) perimeter=perimeter-r12.width;
    if(!r13.width && r13.height>0) perimeter=perimeter-r13.height;
    if(r13.width>0 && !r13.height) perimeter=perimeter-r13.width;
    if(!r23.width && r23.height>0) perimeter=perimeter-r23.height;
    if(r23.width>0 && !r23.height) perimeter=perimeter-r23.width;
    area+=r123.height*r123.height;
    perimeter+=2*(r123.height+r123.width);
}
void write(){
    freopen("reuniune.out", "w", stdout);
    printf("%lld %lld", area, perimeter);
    fclose(stdout);
}
void Rectangle::cn(){
    scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
    width=x2-x1;
    height=y2-y1;
}
Rectangle unite(Rectangle ra, Rectangle rb){
    Rectangle r;
    r.x1=max(ra.x1, rb.x1);
    r.x2=min(ra.x2, rb.x2);
    r.y1=max(ra.y1, rb.y1);
    r.y2=min(ra.y2, rb.y2);
    r.height=r.y2-r.y1;
    r.width=r.x2-r.x1;
    return r;
}