Cod sursa(job #1247342)

Utilizator laurenttlaurentiu pavel laurentt Data 22 octombrie 2014 17:29:54
Problema Subsir crescator maximal Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<iostream>
#include<vector>
#include<fstream>
#include<algorithm>
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

int main() {
  int n; in >> n;
  int max_seq = -1;
  int pos_max = 0;
  vector<int> seq;
  vector<int> best;
  vector<int> prev;

  seq.push_back(-1);
  for(int i = 1; i <= n; ++i) {
    int x; in >> x; 
    seq.push_back(x);
  }

  best.push_back(1);
  prev.push_back(-1);
  for(int i = 1; i <= n; ++i) {
    vector<int>::iterator low;
    low = lower_bound(seq.begin(), seq.begin() + i, seq[i]) - 1;
    //    cout << "i:" << i << " | low:" << *(low) << " | seq[low]:" << seq[low - seq.begin()] << '\n';
    best.push_back(1 + best[low - seq.begin()]);
    prev.push_back(low - seq.begin());
    if(best[i] > max_seq) {
      max_seq = best[i];
      pos_max = i;
    }
  }
  /*  cout << "----------------\n";
  for(int i = 0; i <= n; ++i) {
    cout << "i:" << i<< " best[i]:" << best[i]
	 << " | prev[i]:" << prev[i] << " | seq[i]:" << seq[i] << '\n';
	 }*/

  out << max_seq << '\n';
  vector<int> print_seq;
  int print_seq_size = 0;
  while(seq[pos_max] != -1) {
    print_seq.push_back(seq[pos_max]);
    ++print_seq_size;
    pos_max = prev[pos_max];
  }

  while(print_seq_size > 0) {
    out << print_seq[--print_seq_size] << ' ';
  }
  out << '\n';

  return 0;
}