Cod sursa(job #1213878)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 29 iulie 2014 09:00:43
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;

int N, best;
int V[Nmax], P[Nmax], Q[Nmax], sol[Nmax];

void read()
{
    freopen("scmax.in", "r", stdin);

    scanf("%d\n", &N);

    for ( int i = 1; i <= N; ++i )
            scanf("%d ", &V[i]);

    fclose( stdin );
}

int bin_search( int key )
{
    int m, found = -1, st = 1, dr = best;

    while ( st <= dr )
    {
        m = st + ( dr - st ) / 2;

        if ( Q[m] == key )
        {
            return m;
        }

        if ( Q[m] > key )
        {
            found = m;
            dr = m - 1;
        }
        else
            st = m + 1;
    }

    return found;
}

void LIS()
{
    for ( int i = 1; i <= N; ++i )
    {
        int position = bin_search( V[i] );

        if ( Q[position] == V[i] )
        {
            P[i] = position;
        }
        else
            if ( position == -1 )
            {
                Q[ ++best ] = V[i];
                P[i] = best;
            }
            else
            {
                Q[position] = V[i];
                P[i] = position;
            }
    }
}

void construct()
{
    int ans = N;

    for ( int i = best; i >= 1; i-- )
    {
        while ( P[ans] != i ) ans--;

        sol[i] = V[ans];
    }
}

void print()
{
    freopen("scmax.out", "w", stdout);

    printf("%d\n", best);

    for ( int i = 1; i <= best; ++i )
            printf("%d ", sol[i]);

    fclose( stdin );
}

int main()
{
    read();
    LIS();
    construct();
    print();

    return 0;
}