Cod sursa(job #1754150)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 7 septembrie 2016 16:45:08
Problema Reuniune Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<fstream>
#include<algorithm>
#define f first
#define s second
using namespace std;
int i;
struct drept{
    int xf;
    int yf;
    int xs;
    int ys;
};
drept v[5];
long long aria, pm;
ifstream fin("reuniune.in");
ofstream fout("reuniune.out");
void ff(){
    int i, nr, j, nr1, w[10], u, st, dr;
    pair<int, int> p[10];
    for(i = 1; i <= 3; i++){
        w[2 * i - 1] = v[i].xf;
        w[2 * i] = v[i].xs;
    }
    sort(w + 1, w + 7);
    nr = 1;
    for(i = 2; i <= 6; i++){
        if(w[i] != w[nr]){
            w[++nr] = w[i];
        }
    }
    for(i = 1; i < nr; i++){
        nr1 = 0;
        for(j = 1; j <= 3; j++){
            p[j].f = p[j].s = 0;
        }
        for(j = 1; j <= 3; j++){
            if(v[j].xf <= w[i] && v[j].xs >= w[i + 1]){
                nr1++;
                p[nr1].f = v[j].yf;
                p[nr1].s = v[j].ys;
            }
        }
        sort(p + 1, p + nr1 + 1);
        st = p[1].f;
        dr = p[1].s;
        for(j = 2; j <= nr1; j++){
            if(p[j].f <= dr){
                dr = max(p[j].s, dr);
            }
            else{
                pm += 2 * 1LL * (w[i + 1] - w[i]);
                aria += (w[i + 1] - w[i]) * 1LL * (dr - st);
                st = p[j].f;
                dr = p[j].s;
            }
        }
        if(nr1 == 0){
            continue;
        }
        aria += (w[i + 1] - w[i]) * 1LL * (dr - st);
        pm += 2 * 1LL * (w[i + 1] - w[i]);
    }
}
int main(){
    for(i = 1; i <= 3; i++){
        fin>> v[i].xf >> v[i].yf >> v[i].xs >> v[i].ys;
    }
    ff();
    for(i = 1; i <= 3; i++){
        swap(v[i].xf, v[i].yf);
        swap(v[i].xs, v[i].ys);
    }
    ff();
    fout<< aria / 2 <<" "<< pm <<"\n";
    return 0;
}