Cod sursa(job #1274995)

Utilizator lokixdSebastian lokixd Data 24 noiembrie 2014 17:22:27
Problema Tribute Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <stdio.h>
#define INF 2000000000
#define MAXD 50000
long long lin[MAXD+1], col[MAXD+1], st[MAXD+1], dr[MAXD+1], sus[MAXD+1], jos[MAXD+1];
int main(){
    long long n, dx, dy, i, x, y, cat, minx, miny;
    FILE *fin, *fout;
    fin=fopen("tribute.in", "r");
    fout=fopen("tribute.out", "w");
    fscanf(fin, "%lld%lld%lld", &n, &dx, &dy);
    for(i=0; i<n; i++){
        fscanf(fin, "%lld%lld", &x, &y);
        lin[x]++;
        col[y]++;
    }
    cat=lin[0];
    for(i=1; i<=MAXD; i++){
        st[i]=st[i-1];
        st[i]+=cat;
        cat+=lin[i];
    }
    cat=lin[MAXD];
    for(i=MAXD-1; i>=0; i--){
        dr[i]=dr[i+1];
        dr[i]+=cat;
        cat+=lin[i];
    }
    cat=col[0];
    for(i=1; i<=MAXD; i++){
        jos[i]=jos[i-1];
        jos[i]+=cat;
        cat+=col[i];
    }
    cat=col[MAXD];
    for(i=MAXD-1; i>=0; i--){
        sus[i]=sus[i+1];
        sus[i]+=cat;
        cat+=col[i];
    }
    minx=INF;
    for(i=0; i<=MAXD-dx; i++){
        if(minx>st[i]+dr[i+dx]){
            minx=st[i]+dr[i+dx];
        }
    }
    miny=INF;
    for(i=0; i<=MAXD-dy; i++){
        if(miny>jos[i]+sus[i+dy]){
            miny=jos[i]+sus[i+dy];
        }
    }
    fprintf(fout, "%lld\n", minx+miny);
    fclose(fin);
    fclose(fout);
    return 0;
}