Cod sursa(job #1499295)

Utilizator petru.cehanCehan Petru petru.cehan Data 10 octombrie 2015 14:29:04
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.89 kb
#include <iostream>
#include <fstream>

using namespace std ;
// Se folosesc 3 vectori ( V - ce tine elem vect , Q - initial vid , se ia fiecare elem din V si se suprascrie peste cel mai mic elem din Q
// care este mai mare  decat cel din V .. daca cel din V e mai mare ca toate din Q .. este adaugat la finalul lui Q ) , P - poz pe care
// a fost bagat elementul din V in vect Q

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

int N , V [ 100001 ] , Q [ 100001 ] , P [ 100001 ] , lg_Q , sol [ 1000001 ] , lg_sol ;

void Citire ()
{
    fin >> N ;
    for ( int i = 1 ; i <= N ; ++ i )
            fin >> V [i] ;
}

int Insert ( int val ) // cautare binara
{
    int st = 0 , dr = lg_Q ; // cautarea se face doar in elementele din Q pana atunci bagate ;
    while ( st <= dr )
    {
        int mid = ( st + dr ) >> 1 ;
        if ( Q [ mid ] < val && Q [ mid + 1 ] >= val )
                 {
                    Q [ mid + 1 ] = val ; return ( mid + 1 ) ;
                 }
        else
            if ( Q [ mid ] < val )
                   st = mid + 1 ;
            else
                   dr = mid - 1 ;
    }

    Q [ ++ lg_Q ] = val ;

    return lg_Q ;
}

void AfisareSol ( int poz )
{
    while ( poz >= 1 )
       if ( P [ poz ] == lg_Q )
       {
            sol [ ++ lg_sol ] = V [ poz ] ;
            -- lg_Q , -- poz ;

       }
       else -- poz ;

    fout << lg_sol << "\n" ;
    for ( int i = lg_sol ; i >= 1 ; -- i )
          fout << sol [i] << " " ;
}

int main ()
{
    Citire () ;
    lg_Q = 1 ;
    Q [ 1 ] = V [ 1 ] ;
    P [ 1 ] = 1 ;

    for ( int i = 2 ; i <= N ; ++ i )
    {
        int poz = Insert ( V [i] ) ;
        P [i] = poz ;
    }

    int last = 0 ;
    for ( int i = 1 ; i <= N ; ++ i )
            if ( P [i] == lg_Q )
                   last = i ;

    AfisareSol ( last ) ;

    return 0 ;
}