Cod sursa(job #1533009)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 21 noiembrie 2015 22:04:45
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <cstring>
#define DIM 100005

using namespace std;

ifstream fin("tribute.in");
ofstream fout("tribute.out");

int N,DX,DY;
int FX[DIM],D[DIM],S[DIM],NRS[DIM],NRD[DIM],FY[DIM];
int maxx,maxy,minx=0x3f3f3f3f,miny=0x3f3f3f3f;
int solx,soly;
int main(){
    fin >> N >> DX >> DY;

    solx = soly = 0x3f3f3f3f;

    for(int i=1;i<=N;i++){
        int x,y;
        fin >> x >> y;
        FX[x]++;
        FY[y]++;
        maxx=max(maxx,x);
        maxy=max(maxy,y);
        minx=min(minx,x);
        miny=min(miny,y);
    }

    for(int i=minx;i<=maxx;i++){
        S[i] = S[i-1] + NRS[i-1];
        NRS[i] = NRS[i-1] + FX[i];
    }
    for(int i=maxx;i>=minx;i--){
        D[i] = D[i+1] + NRD[i+1];
        NRD[i] = NRD[i+1] + FX[i];
    }
    for(int i=minx;i<=maxx;i++)
        solx = min(solx,S[i] + D[i + DX]);

    memset(S,0,sizeof(S));
    memset(D,0,sizeof(D));
    memset(NRS,0,sizeof(NRS));
    memset(NRD,0,sizeof(NRD));

    for(int i=miny;i<=maxy;i++){
        S[i] = S[i-1] + NRS[i-1];
        NRS[i] = NRS[i-1] + FY[i];
    }
    for(int i=maxy;i>=miny;i--){
        D[i] = D[i+1] + NRD[i+1];
        NRD[i] = NRD[i+1] + FY[i];
    }
    for(int i=miny;i<=maxy;i++)
        soly = min(soly,S[i] + D[i+DY]);

    fout << solx + soly << "\n";
}