Cod sursa(job #1475448)

Utilizator salam1Florin Salam salam1 Data 24 august 2015 07:39:23
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
const int NMAX = 100505;
int n, A[NMAX], best[NMAX], r, ant[NMAX];
// best[i] = lowest last element of a increasing seq of length i

void read() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &A[i]);
  }
}

void solve() {
  for (int i = 1; i <= n; i++) {
    if (A[i] > A[best[r]]) {
      ant[i] = best[r];
      best[++r] = i;
    } else {
      auto it = lower_bound(best + 1, best + r + 1, i,
        [&] (const int& a, const int& b) -> bool {
          return A[a] < A[b];
        });
      best[it - best] = i;
      ant[i] = best[it - best - 1];
    }
  }
  
  printf("%d\n", r);
  
  // recons
  vector<int> sol;
  int last = best[r];
  while (last) {
    sol.push_back(last);
    last = ant[last];
  }
  reverse(sol.begin(), sol.end());
  for (size_t i = 0; i < sol.size(); i++) {
    if (i > 0) printf(" ");
    printf("%d", A[sol[i]]);
  }
  printf("\n");
}

int main() {
  freopen("scmax.in", "r", stdin);
  freopen("scmax.out", "w", stdout);
  
  read();
  solve();
  return 0;
}