Cod sursa(job #2672941)

Utilizator cristiemanuelstroe cristian emanuel cristiemanuel Data 15 noiembrie 2020 15:13:43
Problema Subsir crescator maximal Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.06 kb
#include  <iostream>
#include  <fstream>

using namespace std;

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

const int Nmax = 1e5 + 5;
int D[Nmax],//un elemet al sirului V in care se termina sclm de lungime k
    V[Nmax],
    P[Nmax],//pozitia elementului adaugat sau inlocuit din D
    I[Nmax],//sclm
    k, n;// k = lungimea sirului;

void caut_binar(int st, int dr, int& p, int x)
{
  while(st <= dr)
  {
    int m = st + (dr - st)/2;
    if(D[m] > x)
      p = m, dr = m - 1;
    else
      st = m + 1;
  }
}

int main()
{
  in>>n;
  for(int i = 1; i <= n; i++)
    in>>V[i];
  k = 1, D[k] = V[1], P[1] = 1;
  for(int i = 2; i <= n; i++)
    if(V[i] > D[k])
      D[++k] = V[i], P[i] = k;
    else
    {
      int p; // pozitia elementului cel mai mic din D, mai mare decat A
      caut_binar(1, k, p, V[i]);
      D[p] = V[i];
      P[i] = p;
    }
  out<<k<<'\n';
  int j = n;
  for(int i = k; i >= 1; i--)
  {
    while(P[j] != i)
      j--;
    I[i] = j;
  }
  for(int i = 1; i <= k; i++)
    out<<V[I[i]]<<' ';
}