Cod sursa(job #2609843)

Utilizator avtobusAvtobus avtobus Data 3 mai 2020 17:18:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
// programare dinamica cu cautarea binara (idea lui Catalin Francu)
#include <stdio.h>
#include <bits/stdc++.h>

#define rep(i, n) for(int i = 0; i < (int)(n); i++)

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
const int INF = 0x3f3f3f3f;

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

int main(void) {
  // freopen("scmax.in", "r", stdin);
  std::ios_base::sync_with_stdio(false);
  std::cin.tie(NULL);
  int N;
  fin >> N;
  vi a(N), prev(N), ind(N), best(N, 2*INF);

  rep(i, N) {
    fin >> a[i];

    int k = lower_bound(best.begin(), best.end(), a[i]) - best.begin();
    if (a[i] < best[k]) {
      best[k] = a[i];
      ind[k] = i;
      prev[i] = (k > 0 ? ind[k-1] : -1);
    }
  }

  int count = lower_bound(best.begin(), best.end(), 2*INF) - best.begin();
  fout << count << '\n';
  int i = ind[count-1];
  vi answer;
  while(i != -1) {
    answer.push_back(a[i]);
    i = prev[i];
  }
  reverse(answer.begin(), answer.end());
  for(auto x: answer)
    fout << x << " ";
  fout << endl;

  return 0;
}