Cod sursa(job #2190432)

Utilizator ApostolIlieDanielApostol Daniel ApostolIlieDaniel Data 30 martie 2018 19:32:58
Problema Tribute Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;

struct punct {int x; int y;};

const int MAXN = 50000, INF = 1e9;

punct a[MAXN + 1];

int car[MAXN + 1], nrst[MAXN + 1], nrdr[MAXN + 1], sumst[MAXN + 1], sumdr[MAXN + 1];

int n, dx, dy;

FILE *fin, *fout;

int solv () {
  int xmax, i, mn;
  xmax = 0;
  for (i = 1; i <= n; i++) {
    car[a[i].x]++;
    xmax = max (xmax, a[i].x);
  }
  for (i = 0; i <= xmax; i++) {
    nrst[i] = nrst[i - 1] + car[i];
    sumst[i] = sumst[i - 1] + nrst[i - 1];
  }
  for (i = xmax - dx + 1; i >= 0; i--) {
    nrdr[i] = nrdr[i + dx] + car[i];
    sumdr[i] = sumdr[i + dx] + nrdr[i + dx];
  }
  mn = INF;
  for (i = 0; i + dx - 1<= xmax; i++) {
    mn = min (mn, sumdr[i + dx] + sumst[i]);
  }
  for (i = 0; i <= xmax; i++)
    sumdr[i] = sumst[i] = nrst[i] = nrdr[i] = car[i] = 0;
  return mn;
}

int main() {
  int sol, i;
  fin = fopen ("tribute.in", "r");
  fout = fopen ("tribute.out", "w");
  fscanf (fin, "%d%d%d", &n, &dx, &dy);
  for (i = 1; i <= n; i++)
    fscanf (fin, "%d%d", &a[i].x, &a[i].y);
  sol = solv ();
  for (i = 1; i <= n; i++)
    a[i].x = a[i].y;
  dx = dy;
  sol += solv();
  fprintf (fout, "%d", sol);
  fclose (fin);
  fclose (fout);
  return 0;
}