Cod sursa(job #2063902)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 11 noiembrie 2017 16:30:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;


const int N = 100010 ;
const int INF = 2000000001 ;

int v [ N ] , best [ N ] , prevVal[ N ] ;
int noNum , bestSol , bestIdx ;
vector < int > sol ;
vector < int >::iterator it ;

//void INIT (){
//    static int i ;
//
//    for ( i = 0 ; i < noNum ; i++ ){
//        best [ i ] = 0 ;
//    }
//
//}

int findFirstBigger ( int x ){
    int left , right , mid ;

    left = 1 , right = noNum ;
    while ( left < right ){
        mid = ( left + right ) / 2 ;

        if ( v [ best [ mid ] ]  < v [ x ] ){
            left = mid + 1 ;
        }else{
            right = mid ;
        }

    }
    return left ;
}

int main(){
    int i ;

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


    scanf("%d", &noNum );

    v[ 0 ] = INF ;
    for ( i = 1 ; i <= noNum ; i++ ){
        scanf("%d", &v[ i ] );
    }

//    INIT();
    best [ 0 ] = -1 ;
    for ( i = 1 ; i <= noNum ; i++ ){
        int chgPos  ;
        chgPos = findFirstBigger ( i );

        prevVal [ i ] = best [ chgPos - 1  ]  ;
        best [ chgPos ] = i ;

        if ( bestSol < chgPos ){
            bestSol = chgPos ;
            bestIdx = i ;
        }

    }

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

    while ( bestIdx != -1 ){

        sol.push_back ( v [ bestIdx ] );
        bestIdx = prevVal [ bestIdx ];
    }

    for ( it = sol.end() - 1  ; it != sol.begin() ; it -- ){
        printf("%d ",*it);
    }
    printf("%d ",*it);

    return 0;
}