Cod sursa(job #2059374)

Utilizator MihaelaCismaruMihaela Cismaru MihaelaCismaru Data 6 noiembrie 2017 22:05:12
Problema Tribute Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.83 kb
#include<fstream>
using namespace std;
ifstream in("tribute.in");
ofstream out("tribute.out");
int n,dx,dy,vx[50001],vy[50001],x,y,mx,my;
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] ++;
        mx = max (mx,x);
        my = max (my,y);
    }
    for (int i = 0; i <= mx-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 = mx; i >= dx; i --) {
        if (i < mx){
            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 <= mx-dx; i ++) {
        minimx = min (minimx, dp[i].first + dp2[i+dx].first);
    }

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

    for (int i = 0; i <= my-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 = my; i >= dy; i --) {
        if (i < my){
            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 <= my-dy; i ++) {
        minimy = min (minimy, dp[i].first + dp2[i+dy].first);
    }
    out << minimx+minimy;
    return 0;
}