Cod sursa(job #813414)

Utilizator ciorile.chioareBogatu Adrian ciorile.chioare Data 15 noiembrie 2012 14:48:07
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.95 kb
#include <cstdio>
#include <queue>
#include <utility>
#include <algorithm>


using namespace std;

template<class T>
bool min(const T& a, const T& b) {
  return ((a < b)?a:b);
}

template<class T1, class T2>
bool operator<(const pair<T1, T2> &p1, const pair<T1, T2> &p2) {
  return (p1.first < p2.first);
}

template<class T>
int binary_search(T* first, int a, int b, const T& value) {
  if(a == b) {
    return (!(first[a] < value))?(a):(a + 1);
  }
  int mid = (a + b) / 2;
  if(first[mid] < value) {
    return binary_search(first, mid + 1, b, value);
  }
  else {
    return binary_search(first, a, mid, value);
  }
}

/*
 *  Functia care determina un subsir crescator maximal dintr-un vector
 */
int* scmax(int *v, int &n) {
  int j;

  int *best = new int[n];
  int *m = new int[n];
  int nmax;

  best[0] = 1;
  m[0] = 0;
  int imax = 0;
  for(int i = 0; i < n; ++i) {
    j = binary_search(m, 0, imax, v[i]);
    fprintf(stderr, "Punem %d la %d\n", v[i], j);
    m[j] = v[i];
    best[i] = j;
    if(j > imax)
      imax++;
  }

  delete m;
  return best;
}

void afis(int *v, int n) {
  for(int i = 0; i < n; ++i)
    fprintf(stderr, "%d ", v[i]);
  fprintf(stderr, "\n");
}

int main(int argc, char **argv) {

  argc--;
  argv++;

  //FILE *in = fopen(argv[0], "r");
  //FILE *out = fopen(argv[1], "w");
  FILE *in = fopen("scmax.in", "r");
  FILE *out = fopen("scmax.out", "w");

  int n;

  fscanf(in, "%d", &n);

  int *price = new int[n];
  for(int i = 0; i < n; ++i) {
    fscanf(in, "%d", price + i);
  }

  int *scm = scmax(price, n);
  int *rez = new int[n];
  int j = 0;

  int imax = 0;

  for(int i = 0; i < n; ++i) {
    if(scm[i] > scm[imax])
      imax = i;
  }

  int prev = scm[imax];
  for(int i = n - 1; i >= 0; --i) {
    if(scm[i] == prev) {
      rez[j] = i;
      j++;
      prev--;
    }
  }
  fprintf(out, "%d\n", j);
  for(int i = j - 1; i >= 0; --i)
      fprintf(out, "%d ", price[rez[i]]);
  fprintf(out, "\n");

  fclose(in);
  fclose(out);
  return 0;
}