Pagini recente » Cod sursa (job #1100854) | Cod sursa (job #2863725) | Cod sursa (job #1764394) | Cod sursa (job #595068) | Cod sursa (job #1213878)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 100005;
int N, best;
int V[Nmax], P[Nmax], Q[Nmax], sol[Nmax];
void read()
{
freopen("scmax.in", "r", stdin);
scanf("%d\n", &N);
for ( int i = 1; i <= N; ++i )
scanf("%d ", &V[i]);
fclose( stdin );
}
int bin_search( int key )
{
int m, found = -1, st = 1, dr = best;
while ( st <= dr )
{
m = st + ( dr - st ) / 2;
if ( Q[m] == key )
{
return m;
}
if ( Q[m] > key )
{
found = m;
dr = m - 1;
}
else
st = m + 1;
}
return found;
}
void LIS()
{
for ( int i = 1; i <= N; ++i )
{
int position = bin_search( V[i] );
if ( Q[position] == V[i] )
{
P[i] = position;
}
else
if ( position == -1 )
{
Q[ ++best ] = V[i];
P[i] = best;
}
else
{
Q[position] = V[i];
P[i] = position;
}
}
}
void construct()
{
int ans = N;
for ( int i = best; i >= 1; i-- )
{
while ( P[ans] != i ) ans--;
sol[i] = V[ans];
}
}
void print()
{
freopen("scmax.out", "w", stdout);
printf("%d\n", best);
for ( int i = 1; i <= best; ++i )
printf("%d ", sol[i]);
fclose( stdin );
}
int main()
{
read();
LIS();
construct();
print();
return 0;
}