Cod sursa(job #2539095)

Utilizator Tudor06MusatTudor Tudor06 Data 5 februarie 2020 16:56:15
Problema Subsir crescator maximal Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 1e5;

int dp[NMAX]; /// lungimea scmax care se termina pe pozitia i
int v[NMAX];

int cb( int st, int dr, int val ) {
    int mij;
    while ( st < dr - 1 ) {
        mij = ( st + dr ) / 2;
        if ( dp[mij] <= val )
            st ++;
        else
            dr ++;
    }
    return st;
}

int main() {
    ifstream fin( "scmax.in" );
    ofstream fout( "scmax.out" );
    int n, i, maxim, poz;
    fin >> n;
    for ( i = 0; i < n; i ++ ) {
        fin >> v[i];
    }
    dp[1] = v[0];
    maxim = 1;
    for ( i = 1; i < n; i ++ ) {
        poz = cb( 1, maxim + 1, v[i] );
        if ( dp[poz] > v[i] )
            dp[poz] = v[i];
        else if ( dp[poz] < v[i] ) {
            if ( poz == maxim ) {
                dp[poz + 1] = v[i];
                maxim ++;
            } else
                dp[poz + 1] = min( dp[poz + 1], v[i] );
        }
    }
    fout << maxim << '\n';
    for ( i = 1; i <= maxim; i ++ )
        fout << dp[i] << ' ';
    return 0;
}