Cod sursa(job #1815838)

Utilizator TincaMateiTinca Matei TincaMatei Data 25 noiembrie 2016 20:22:27
Problema Secv Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <cstdio>
#include <algorithm>

const int MAX_N = 5000;

int  v[1+MAX_N], din[1+MAX_N], first[1+MAX_N], tab[1+MAX_N];
int *p[MAX_N];

bool cmp(int *a, int *b) {
  return *a < *b;
}

int normalize(int n) {
  int last, j;
  for(int i = 1; i <= n; ++i)
    p[i] = &v[i];

  std::sort(p + 1, p + n + 1, cmp);

  j = 1;
  last = *p[1];
  for(int i = 1; i <= n; ++i) {
    if(*p[i] == last)
      *p[i] = j;
    else {
      j++;
      last = *p[i];
      *p[i] = j;
    }
  }
  return j;
}

int main() {
  int n, dist, max, size, x, y;
  FILE *fin = fopen("secv.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 1; i <= n; ++i) {
    fscanf(fin, "%d", &v[i]);
  }
  fclose(fin);

  dist = normalize(n);

  for(int i = 1; i <= n; ++i) {
    x = v[i];
    y = tab[x - 1];
    if(tab[x - 1] > 0) {
      din[i] = din[y] + 1;
      first[i] = first[y];
    } else {
      din[i] = 1;
      first[i] = i;
    }
    if(din[i] > din[tab[x]])
      tab[x] = i;
    else if(din[i] == din[tab[x]] && first[i] > first[tab[x]])
      tab[x] = i;
  }

  FILE *fout = fopen("secv.out", "w");
  max = size = -1;
  for(int i = 1; i <= n; ++i)
    if(din[i] > max) {
      max = din[i];
      size = i - first[i] + 1;
    } else if(din[i] == max && i - first[i] + 1 < size)
      size = i - first[i] + 1;

  if(max == dist)
    fprintf(fout, "%d", size);
  else
    fprintf(fout, "-1");
  fclose(fout);
  return 0;
}