Pagini recente » Cod sursa (job #3005275) | Cod sursa (job #2850342) | Cod sursa (job #1439286) | Cod sursa (job #704306) | Cod sursa (job #1373810)
#include <iostream>
#include <fstream>
#include <vector>
#include <ctime>
#include <cstdlib>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int MAXN = 100000;
int last[MAXN+1], best[MAXN+1], sir[MAXN+1], N, lgMax, start;
vector <int> sol;
void citire()
{
in>>N;
for(int i = 1; i <= N; i++)
in>>sir[ i ];
}
int cautBin(int left, int right, int x)
{
int p;
while( left <= right )
{
int m = (left + right)/2;
if( last[ m ] < x )
p = m, left = m + 1;
else right = m - 1;
}
return p;
}
void dinamica()
{
last[ 1 ] = sir[ 1 ]; best[ 1 ] = 1; lgMax = 1; start = 1;
for(int i = 2; i <= N; i++)
if( sir[ i ] <= last[ 1 ] )
best[ i ] = 1, last[ 1 ] = sir[ i ];
else
if( sir[ i ] > last[ lgMax ] )
best[ i ] = lgMax + 1, last[ lgMax + 1 ] = sir[ i ], lgMax++, start = i;
else
{
int p = cautBin( 1, lgMax, sir[ i ]);
best[ i ] = p + 1; last[ p + 1 ] = sir[ i ];
}
}
void getSolution()
{
sol.push_back( sir[ start ] ); lgMax--; int q = sir[ start ];
for(int i = start - 1; i >= 1 && lgMax >= 0; i--)
if( best[ i ] == lgMax && sir[ i ] < q )
{
sol.push_back( sir[ i ] );
q = sir[ i ];
lgMax--;
}
}
int main()
{
citire();
dinamica();
out<<lgMax<<endl;
getSolution();
for(int i = sol.size() - 1; i >= 0; i--)
out<<sol[ i ]<<' ';
return 0;
}