Cod sursa(job #3268815)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 17 ianuarie 2025 17:48:33
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
using namespace std;

const int SIZE = 100001;

int n, k;
int A[SIZE], D[SIZE], P[SIZE], I[SIZE];

int main()
{
    //citim datele de intrare
    fin >> n;
    for(int i = 1; i <= n; ++i)
      fin >> A[i];

    //k = lg_max subsir cresc (NU STRICT), D[K] = elem. al lui A[] in care se term un sub_cr de lg K
    k = 1;
    D[k] = A[1];
    //P[i] reprezintă poz în D[] unde a fost plasat A[i] (adăugare / înlocuire)
    P[1] = 1;
    //cautam binar pt ca sirul D este crescator
    for(int i = 2 ; i <= n ; i ++)
        if(A[i] >= D[k])
            D[++k] = A[i], P[i] = k;
        else
        {
            int st = 1 , dr = k , p = k + 1;
            while(st <= dr)
            {
                int m = (st + dr) / 2;
                if(D[m] > A[i])
                    p = m, dr = m - 1;
                else
                    st = m + 1;
            }
            D[p] = A[i];
            P[i] = p;
        }

    //șirul I[] va conține indicii elem. din A[] care fac parte din subșirul cresc maximal
    int j = n;
    for(int i = k ; i >= 1 ; i --)
    {
        while(P[j] != i)
            j --;
        I[i] = j;
    }

    //daca doresc sa eliminim si valorile egale din sir (sa fie strict crescator):
    int last = A[I[1]];
    int new_k = k;
    for(int i = 2; i <= k; ++i)
    {
        if(A[I[i]] == last)
          new_k--;
        else
          last = A[I[i]];
    }

    fout << new_k << "\n";
    fout << A[I[1]] << " ";

    last = A[I[1]];
    new_k = k;
    for(int i = 2; i <= k; ++i)
    {
        if(A[I[i]] == last)
          new_k--;
        else
          fout << A[I[i]] << " ", last = A[I[i]];
    }

    return 0;
}