Pagini recente » Borderou de evaluare (job #1569417) | Cod sursa (job #759377) | Cod sursa (job #1257521) | Cod sursa (job #2749605) | Cod sursa (job #2063902)
#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;
}