Pagini recente » Monitorul de evaluare | Cod sursa (job #1884230) | Cod sursa (job #1152114) | Cod sursa (job #1927400) | Cod sursa (job #1563825)
#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 ;
}