Pagini recente » Cod sursa (job #2479355) | Cod sursa (job #2136183) | Cod sursa (job #801560) | Cod sursa (job #141720) | Cod sursa (job #890235)
Cod sursa(job #890235)
#include<cstdio>
#include<vector>
#define NMAX 100005
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
using namespace std;
vector <int> a;
vector <int> lis;
int N;
void read( void )
{
fscanf(f,"%d",&N);
int x;
for(int i(1); i <= N ; ++i)
{
fscanf(f,"%d",&x);
a.push_back(x);
}
}
void solve( void )
{
vector <int> p(a.size());
int left,right;
lis.push_back(0);
for(int i(1) ; i < a.size(); ++i)
{
if(a[lis.back()] < a[i] )
{
p[i]=lis.back();
lis.push_back(i);
continue;
}
int mid=0;
for(left = 0 , right=lis.size()-1 ; left < right ;)
{
mid=(left+right)/2;
if( a[lis[mid]] < a[i] )
left=mid+1;
else
right=mid;
}
if( a[i] < a[lis[mid]] )
{
if (left > 0) p[i] = lis[left-1];
lis[left] = i;
}
}
int v;
for(int i=lis.size() , v=lis.back() ; i-- ; v=p[v])
lis[i]=v;
}
void write( void )
{
fprintf(g,"%d\n",lis.size());
for(int i(0); i < lis.size() ; ++i )
fprintf(g,"%d ",a[lis[i]] );
}
int main( void )
{
read();
solve();
write();
return 0;
}