Cod sursa(job #3268816)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 17 ianuarie 2025 17:49:13
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <bits/stdc++.h>

using namespace std;

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

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;
}