Cod sursa(job #474005)

Utilizator daniel.dumitranDaniel Dumitran daniel.dumitran Data 2 august 2010 00:36:37
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <stdio.h>
#include <stdlib.h>

#include <set>
#include <vector>
#include <algorithm>

#define MAXN 5000

int n;
FILE *f;
int a[MAXN];

int best = 2 * MAXN;
int max;

struct secv {
  int start;
};

#define printf(...) 

int main() {
  f = fopen("secv.in", "rt");
  fscanf(f, "%d", &n);
  for (int i = 0; i < n; ++i) fscanf(f, "%d", a + i);
  fclose(f);

  {
    std::set<int> all;
    for (int i = 0; i < n; ++i) all.insert(a[i]);
    std::vector<int> v(all.begin(), all.end());
    std::sort(v.begin(), v.end());
    max = v.size();
    for (int i = 0; i < n; ++i)
      a[i] = std::lower_bound(v.begin(), v.end(), a[i]) - v.begin();
  }

  secv** s = new secv*[max + 1];
  for (int i = 0; i <= max; ++i) s[i] = NULL;

  for (int i = 0; i < n; ++i) {
    int x = a[i];
    if (!x) {
      if (s[0]) delete s[0];
      s[0] = new secv();
      s[0]->start = i;
      if (max == 1)
	best = 1;
      printf("Start de pe %d il vrea pe 1\n", i);
      continue;
    }

    if (s[x - 1]) {
      if (s[x]) delete s[x];
      s[x] = s[x - 1];
      s[x - 1] = NULL;
      printf("Start de pe %d il vrea pe %d\n", s[x]->start, x + 1);
      if (x + 1 == max) {
	printf("Gasti solutie de pe %d -> %d de lungime %d\n", 
	      s[x]->start, i, i - s[x]->start + 1);
	if (i - s[x]->start + 1 < best)
	  best = i - s[x]->start + 1;
      }
    }
  }
  
  if (best == 2 * MAXN) best = -1;
  f = fopen("secv.out", "wt");
  fprintf(f, "%d\n", best);
  fclose(f);
}