Cod sursa(job #1363836)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 27 februarie 2015 11:49:09
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <iostream>
#include <cstdio>
#include <deque>
using namespace std;

const int MAXN = 100000;

int N, s[MAXN+1], lgMax = 1, list[MAXN+1], best[MAXN+1], drum[MAXN+1], poz;

void citire()
{
    scanf("%d",&N);
    for(int i = 1; i <= N; i++)
        scanf("%d",&s[ i ]);
}

int cautBin(int left, int right, int x)
{
    int res = -1;

    while( left <= right )
    {
        int m = ( left + right ) / 2;

        if( list[ m ] < x )
        {
            res = m;
            left = m + 1;
        }
        else right = m - 1;
    }

    return res;
}


void solve()
{
    for(int i = 2; i <= N; i++)
    {
        if( s[ i ] > list[ lgMax ] )
        {
            list[ ++lgMax ] = s[ i ];
            best[ i ] = lgMax;
            //drum[ i ] = poz;
            poz = i;
            continue;
        }

        if( s[ i ] < list[ 1 ] )
        {
            list[ 1 ] = s[ i ];
            best[ i ] = 1;
            //drum[ i ] = i;
            continue;
        }

        int p = cautBin(1,lgMax,s[ i ]);
        list[ p + 1 ] = s[ i ];
        best[ i ] = best[ p ] + 1;
        //drum[ i ] = p;
    }
}

deque <int> sol;

void getSolution()
{
    sol.push_back( s[ poz ] );
    lgMax--;

    for(int i = N; i >= 1 && lgMax >= 1; i--)
    {
        if( best[ i ] == lgMax && s[ i ] < s[ poz ] )
        {
            sol.push_front( s[ i ] );
            lgMax--;
        }
    }

    for(int i = 0; i < sol.size(); i++)
        printf("%d ",sol[ i ]);
}



int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    citire();

    list[ 1 ] = s[ 1 ]; best[ 1 ] = 1; //drum[ 1 ] = 1; poz = 1;

    solve();
    printf("%d\n",lgMax);
    getSolution();


    return 0;
}