Cod sursa(job #2709853)

Utilizator cristi_macoveiMacovei Cristian cristi_macovei Data 21 februarie 2021 13:58:44
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <iostream>
#include <fstream>
#include <vector>

const int NMAX = 1e5;

int a[1 + NMAX];
int dp[1 + NMAX];
int dpIdx[1 + NMAX];
int prev[1 + NMAX];

std::vector<int> sol;

int bs(int value, int limit) {
  int left = 1, right = limit, ans = 0;

  while (left <= right) {
    int mid = (left + right) >> 1;

    if (dp[mid] < value) {
      left = mid + 1;
      ans = mid;
    } else
      right = mid - 1;
  }

  return ans;
}

int main() {
  std::ifstream in("scmax.in");
  std::ofstream out("scmax.out");

  int n, lengthMax = 0;
  in >> n;

  for (int i = 1; i <= n; ++i)
    in >> a[i];

  for (int i = 1; i <= n; ++i) {
    int pos = bs(a[i], lengthMax);

    dp[pos + 1]    = a[i];
    dpIdx[pos + 1] = i;
    prev[i]        = dpIdx[pos];

    lengthMax = std::max(lengthMax, pos + 1);
  }

  out << lengthMax << '\n';
  int current = dpIdx[lengthMax];

  while (current != 0) {
    sol.emplace_back(current);

    current = prev[current];
  }

  for (int i = (int)sol.size() - 1; i >= 0; --i)
    out << a[sol[i]] << ' ';
  out << '\n';

  return 0;
}