Cod sursa(job #2059700)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 7 noiembrie 2017 14:24:00
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream>
using namespace std;
ifstream in("tribute.in");
ofstream out("tribute.out");
int n,dx,dy,vx[50001],vy[50001],x,y;
long long minimx,minimy;
pair<long long,int>dp[50001],dp2[50001];
int main (void) {
    in >> n;
    in >> dx >> dy;
    for (int i = 1; i <= n; i ++) {
        in >> x >> y;
        vx[x] ++;
        vy[y] ++;
    }
    for (int i = 0; i <= 50000-dx; i ++) {
        if (i > 0){
            dp[i].first = dp[i-1].first + dp[i-1].second;
            dp[i].second = dp[i-1].second;
        }
         if (vx[i] > 0){
            dp[i].second +=vx[i];
        }
    }
    for (int i = 50000; i >= dx; i --) {
        if (i < 50000){
            dp2[i].first = dp2[i+1].first + dp2[i+1].second;
            dp2[i].second = dp2[i+1].second;
        }
        if (vx[i] > 0){
            dp2[i].second +=vx[i];
        }
    }
    minimx = 1e15;
    for (int i = 0; i <= 50000-dx; i ++) {
        minimx = min (minimx, dp[i].first + dp2[i+dx].first);
    }

    for (int i = 0; i <= 50000; i ++)
        dp[i].first = 0,dp[i].second = 0,dp2[i].first = 0,dp2[i].second = 0;

    for (int i = 0; i <= 50000-dy; i ++) {
        if (i > 0){
            dp[i].first = dp[i-1].first + dp[i-1].second;
            dp[i].second = dp[i-1].second;
        }
        if (vy[i] > 0){
            dp[i].second +=vy[i];
        }
    }
    for (int i = 50000; i >= dy; i --) {
        if (i < 50000){
            dp2[i].first = dp2[i+1].first + dp2[i+1].second;
            dp2[i].second = dp2[i+1].second;
        }
        if (vy[i] > 0){
            dp2[i].second +=vy[i];
        }
    }
    minimy = 1e15;
    for (int i = 0; i <= 50000-dy; i ++) {
        minimy = min (minimy, dp[i].first + dp2[i+dy].first);
    }
    minimx+=minimy;
    out << minimx;
    return 0;
}