Cod sursa(job #1006914)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 7 octombrie 2013 21:43:31
Problema Subsir 2 Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 5005;

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

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

    scanf("%d", &N);

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

    fclose( stdin );
}

int bin_search( int key )
{
    int st = 1, dr = Q[0], m, found = -1;

    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[ ++Q[0] ] = V[i];
                P[i] = Q[0];
            }
            else
            {
                Q[position] = V[i];
                P[i] = position;
            }
    }
}

void construct()
{
    int ans = N;

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

        sol[i] = ans;
    }
}

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

    printf("%d\n", Q[0]);

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

    fclose( stdout );
}

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

    return 0;
}