Cod sursa(job #789495)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 18 septembrie 2012 14:04:57
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fi("tribute.in");
ofstream fo("tribute.out");

#define MAXN 50010

int N, DX, DY;
int X[MAXN + 1], Y[MAXN + 1];
int SXL[MAXN + 1], SYL[MAXN + 1];
int SXR[MAXN + 1], SYR[MAXN + 1];

void print(int *v, int n)
{
  for(int i = 0; i < n; i++)
    cout << v[i] << " ";
  cout << endl;
}

void compute_left(int *X, int *SX)
{
  int *NX = new int[MAXN + 1];
  for(int i = 0; i <= MAXN; i++)
    NX[i] = X[i];

  for(int i = 0; i < MAXN; i++)
    NX[i + 1] += NX[i];

  SX[0] = 0;
  for(int i = 1; i <= MAXN; i++)
    SX[i] = SX[i - 1] + NX[i - 1];

  delete NX;

//  print(SX, 6);
}

void compute_right(int *X, int *SX)
{
  int *NX = new int[MAXN + 1];
  for(int i = 0; i <= MAXN; i++)
    NX[i] = X[i];

  for(int i = MAXN; i > 0; i--)
    NX[i - 1] += NX[i];

  SX[MAXN] = 0;
  for(int i = MAXN - 1; i >= 0; i--)
    SX[i] = SX[i + 1] + NX[i + 1];

  delete NX;

//  print(SX, 6);
}

void read()
{
  fi >> N >> DX >> DY;

  for(int i = 0; i <= MAXN; i++)
    X[i] = Y[i] = 0;

  for(int i = 0; i < N; i++)
  {
    int x, y;
    fi >> x >> y;
    X[x]++;
    Y[y]++;
  }

  compute_left(X, SXL);
  compute_left(Y, SYL);

  compute_right(X, SXR);
  compute_right(Y, SYR);
}

int solve(int *SL, int *SR, int D)
{
  int cost_min = 1 << 30;
  for(int i = 0; i <= MAXN - D; i++)
  {
    // i fixeaza capatul din stanga
    // j capatul din dreapta
    int j = i + D;
    int cost = SL[i] + SR[j];
    cost_min = min(cost_min, cost);
  }
  return cost_min;
}

int main(int argc, char *argv[])
{
  read();
  fo << (solve(SXL, SXR, DX) + solve(SYL, SYR, DY))
     << endl;
  return 0;
}