Cod sursa(job #1373802)

Utilizator DorelBarbuBarbu Dorel DorelBarbu Data 4 martie 2015 20:39:08
Problema Subsir crescator maximal Scor 95
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;

ifstream in("scmax.in");
ofstream out("scmax.out");

const int MAXN = 100000;

int last[MAXN+1], best[MAXN+1], sir[MAXN+1], N, lgMax, start;
vector <int> sol;

void citire()
{
    in>>N;
    for(int i = 1; i <= N; i++)
        in>>sir[ i ];
}

int cautBin(int left, int right, int x)
{
    int p;

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

        if( last[ m ] < x )
            p = m, left = m + 1;
        else  right = m - 1;
    }

    return p;
}

void dinamica()
{
    last[ 1 ] = sir[ 1 ]; best[ 1 ] = 1; lgMax = 1;

    for(int i = 2; i <= N; i++)
        if( sir[ i ] <= last[ 1 ] )
            best[ i ] = 1, last[ 1 ] = sir[ i ];
        else
        if( sir[ i ] > last[ lgMax ] )
            best[ i ] = lgMax + 1, last[ lgMax + 1 ] = sir[ i ], lgMax++, start = i;
        else
        {
            int p = cautBin( 1, lgMax, sir[ i ]);
            best[ i ] = p + 1; last[ p + 1 ] = sir[ i ];
        }
}

void getSolution()
{
    sol.push_back( sir[ start ] ); lgMax--; int q = sir[ start ];
    for(int i = start - 1; i >= 1 && lgMax >= 0; i--)
        if( best[ i ] == lgMax && sir[ i ] < q )
        {
            sol.push_back( sir[ i ] );
            q = sir[ i ];
            lgMax--;
        }
}

int main()
{
    citire();
    dinamica();
    out<<lgMax<<endl;
    getSolution();
    for(int i = sol.size() - 1; i >= 0; i--)
        out<<sol[ i ]<<' ';
    return 0;
}