Cod sursa(job #780090)

Utilizator vendettaSalajan Razvan vendetta Data 19 august 2012 21:25:28
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.08 kb
#include <iostream>
#include <fstream>

using namespace std;

#define nmax 50005
#define inf (1<<30)

ifstream f("tribute.in");
ofstream g("tribute.out");

int n, DX, DY, frecX[nmax], frecY[nmax], cnt[nmax], st[nmax], dr[nmax], sus[nmax], jos[nmax];
int rez=0;

void citeste(){

    f >> n >> DX >> DY;//nr de pct si dimen terenului;
    for(int i=1; i<=n; i++){
        int x,y;
        f >> x >> y;
        ++frecX[x];//se afla un pct pe Ox la pct x
        ++frecY[y];//same
    }

}

void sterge(int a[]){

    for(int i=0; i<nmax; i++) a[i] = 0;

}

void rezolva(){

    //ma intereseaza sa aleg un drepuntghi a. i. distantele de la marginile lui la restul pct sa fi minima;
    //aleg primadata unde pun Dx-ul si apou Dy-ul(astea 2 nu depind una fata de alta)
    //pt Ox : st[i] = presupun ca latura din partea stanga a drepuntghiului cautat(aia paralela cu Oy) se afla in i;
    //=> st[i] = costul la stanga
    //dr[i] la dreapta
    // si la fel pt Oy
    // cnt[i] = cate pct sunt pana in dreapta I inclusiv

    //pt Ox :
    for(int i=0; i<nmax; i++){
        st[i] = 1 * cnt[i-1] + st[i-1];// asta inseamna ca eu le aduc pe toate in i;
        cnt[i] = cnt[i-1] + frecX[i];
    }

    sterge(cnt);
    for(int i=nmax-1; i>=0; i--){
        dr[i] = 1 * cnt[i+1] + dr[i+1];
        cnt[i] = cnt[i+1] + frecX[i];
    }

    int Min = inf;
    for(int i=0; i<nmax; i++){//pp ca i e latura stanga paralele cu OY
        if (i+DX < nmax) Min = min(Min, st[i] + dr[i+DX]);
    }
    rez = Min;

    //pt Oy;
    sterge(cnt);
    for(int i=0; i<nmax; i++){
        jos[i] = 1*cnt[i-1] + jos[i-1];
        cnt[i] = cnt[i-1] + frecY[i];
    }

    sterge(cnt);
    for(int i=nmax-1; i>=0; i--){
        sus[i] = 1*cnt[i+1] + sus[i+1];
        cnt[i] = cnt[i+1] + frecY[i];
    }

    Min = inf;
    for(int i=0; i<nmax; i++){
        if (i+DY < nmax) Min = min(Min, jos[i] + sus[i+DY]);
    }

    rez += Min;

    g << rez << "\n";

}

int main(){

    citeste();
    rezolva();

    f.close();
    g.close();

    return 0;

}