Cod sursa(job #1781870)

Utilizator TincaMateiTinca Matei TincaMatei Data 17 octombrie 2016 15:57:43
Problema Tribute Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 50000;
int px1[1+MAX_N];
int py1[1+MAX_N];
int px2[1+MAX_N];
int py2[1+MAX_N];

int main() {
  int n, x, y, x1, x2, y1, y2, dx, dy;
  FILE *fin = fopen("tribute.in", "r");
  fscanf(fin, "%d%d%d", &n, &dx, &dy);
  x1 = 1000000;
  y1 = 1000000;
  x2 = 0;
  y2 = 0;
  for(int i = 0; i < n; i++) {
    fscanf(fin, "%d%d", &x, &y);
    px1[x]++;
    py1[y]++;
    px2[x]++;
    py2[y]++;
    if(x < x1)
      x1 = x;
    if(x > x2)
      x2 = x;
    if(y < y1)
      y1 = y;
    if(y > y2)
      y2 = y;
  }
  fclose(fin);

  int np, p;
  np = 0;
  for(int i = x1; i <= x2; i++) {
    p = px1[i];
    if(i > x1)
      px1[i] = px1[i - 1] + np;
    else
      px1[i] = 0;
    np = np + p;
  }
  np = 0;
  for(int i = x2; i >= x1; i--) {
    p = px2[i];
    if(i < x2)
      px2[i] = px2[i + 1] + np;
    else
      px2[i] = 0;
    np = np + p;
  }
  np = 0;
  for(int i = y1; i <= y2; i++) {
    p = py1[i];
    if(i > y1)
      py1[i] = py1[i - 1] + np;
    else
      py1[i] = 0;
    np = np + p;
  }
  np = 0;
  for(int i = y2; i >= y1; i--) {
    p = py2[i];
    if(i < y2)
      py2[i] = py2[i + 1] + np;
    else
      py2[i] = 0;
    np = np + p;
  }

  int minX, minY;
  minX = minY = 1000000000;
  if(x1 > x2 - dx)
    minX = 0LL;
  if(y1 > y2 - dy)
    minY = 0LL;
  for(int i = x1; i <= x2 - dx; i++)
    if(px1[i] + px2[i + dx] < minX)
      minX = px1[i] + px2[i + dx];
  for(int i = y1; i <= y2 - dy; i++) {
    if(py1[i] + py2[i + dy] < minY)
      minY = py1[i] + py2[i + dy];
  }

  FILE *fout = fopen("tribute.out", "w");
  fprintf(fout, "%d", minX + minY);
  fclose(fout);
  return 0;
}