Cod sursa(job #1563825)

Utilizator jurjstyleJurj Andrei jurjstyle Data 6 ianuarie 2016 20:04:54
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

using namespace std ;

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

int n , maxim , nr , k , poz;
int v[100005] ; //memoreaza sirul
int best[100005] ; //memoreaza lungimea maxima a subsirului de la (i,N)
int p[100005] ; //folosit pentru reconstituire
int L[100005] ; //folosit pentru posiblitatea folosirii cautarii binare

void afis ( int ) ;
int caut ( int ) ;

int main()
{
   f >> n ;
   for ( int i = 1 ; i <= n ; ++i )
     f >> v[i] ;
   //initializarea programarii dinamica
   L[0] = 0 ;
   best[1] = L[1] = 1 ;
   nr = 1 ;
   //programarea dinamica
   for ( int i = 2 ; i <= n ; ++i )
    {
      poz = caut ( v[i] ) ;
      p[i] = L[poz] ;
      best[i] = poz + 1 ;
      L[poz + 1] = i ;
      if ( nr < poz + 1 )
        nr = poz + 1 ;
    }
   //cautarea lungimii maxime
   poz = 0 ;
   for ( int i = 1 ; i <= n ; ++i )
       if ( maxim < best[i] )
          maxim = best[i] , poz = i;
   g << maxim << "\n" ;
   afis ( poz ) ; //apelam functia de reconstituire din punctul de inceput
   return 0;
}
void afis ( int x )
{
 if ( p[x] > 0 )
    afis ( p[x] ) ;
 g << v[x] << " " ;
}
int caut ( int x )
{
   int p = 0 , u = nr , m = ( p + u ) / 2 ;
   while ( p <= u )
    {
      if ( v[L[m]] < x &&  v[L[m+1]] >= x )
        return m ;
      else if ( v[L[m+1]] < x )
        p = m + 1 , m = ( p + u ) / 2 ;
      else
        u = m - 1 ; m = ( p + u ) / 2 ;
    }
   return nr ;
}