Cod sursa(job #2690499)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 24 decembrie 2020 12:03:21
Problema Subsir crescator maximal Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <fstream>
using namespace std;
const int NMAX = 1000;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
int v[NMAX + 1], dp[NMAX + 1], last[NMAX + 1];
int cb ( int x, int n ) {
    int pos = 0, pas = (1 << 10);
    for ( ;pas; pas >>= 1)
        if ( pos + pas <= n && v[ dp[pos + pas] ] < x )
            pos += pas;
    return pos + 1;
}
void Write_sol ( int n )  {
    if( n != 0 ) {
        Write_sol( last[n] );
        fout << v[n] << ' ';
    }
}
int main() {
    int n, i, cate, poz;
    fin >> n;
    for ( i = 1; i <= n; i++ )
        fin >> v[i];
    dp[cate = 1] = 1;
    for ( i = 2; i <= n; i++ ) {
        poz = cb(v[i], cate);
        if ( poz == cate + 1 )
            cate++;
        dp[poz] = i;
        if ( poz == 1 )
            last[i] = 0;
        else
            last[i] = dp[poz - 1];
    }
    fout << cate << '\n';
    Write_sol ( dp[cate] );

    return 0;
}