Cod sursa(job #1044476)

Utilizator CosminRusuCosmin Rusu CosminRusu Data 29 noiembrie 2013 22:07:27
Problema Tribute Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <string.h>

using namespace std;

const char infile[] = "tribute.in";
const char outfile[] = "tribute.out";

ifstream fin(infile);
ofstream fout(outfile);

const int MAXN = 50022;
const int oo = (1 << 30);

typedef vector<int> Graph[MAXN];
typedef vector<int> :: iterator It;

const inline int min(const int &a, const int &b) { if( a > b ) return b;   return a; }
const inline int max(const int &a, const int &b) { if( a < b ) return b;   return a; }
const inline void Get_min(int &a, const int b)    { if( a > b ) a = b; }
const inline void Get_max(int &a, const int b)    { if( a < b ) a = b; }

int N, Dx, Dy, freqx[MAXN], freqy[MAXN], many[MAXN], st[MAXN], dr[MAXN], sus[MAXN], jos[MAXN];

int main() {
    fin >> N >> Dx >> Dy;
    for(int i = 1 ; i <= N ; ++ i) {
        int x, y;
        fin >> x >> y;
        ++ freqx[x];  ++ freqy[y];
    }
    for(int i = 0 ; i < MAXN ; ++ i) {
        st[i] = 1*many[i-1] + st[i-1];
        many[i] = many[i-1] + freqx[i];
    }
    for(int i = 0 ; i < MAXN ; ++ i)
        many[i] = 0;
    for(int i = MAXN - 1 ; i >= 0; -- i) {
        dr[i] = 1*many[i+1] + dr[i+1];
        many[i] = many[i+1] + freqx[i];
    }
    int Ans1 = oo;
    for(int i = 0 ; i < MAXN ; ++ i)
        if( i + Dx < MAXN)
            Ans1  = min(Ans1 , st[i] + dr[i + Dx]);
    for(int i = 0 ; i < MAXN ; ++ i)
        many[i] = 0;
    for(int i = 0 ; i < MAXN ; ++ i) {
        jos[i] = 1*many[i-1] + jos[i-1];
        many[i] = many[i-1] + freqy[i];
    }
    for(int i = 0 ; i < MAXN ; ++ i)
        many[i] = 0;
    for(int i = MAXN - 1 ; i >= 0; -- i) {
        sus[i] = 1*many[i+1] + sus[i+1];
        many[i] = many[i+1] + freqy[i];
    }
    int Ans2 = oo;
    for(int i = 0 ; i + Dx < MAXN ; ++ i)
        if( i + Dy < MAXN )
            Ans2 = min(Ans2, jos[i] + sus[i + Dy]);
    fout << Ans1 + Ans2 << '\n';
    fin.close();
    fout.close();
    return 0;
}