Pagini recente » Cod sursa (job #1782465) | Cod sursa (job #1428451) | Cod sursa (job #788549) | Cod sursa (job #2397397) | Cod sursa (job #902917)
Cod sursa(job #902917)
#include<cstdio>
#include<vector>
FILE *f=fopen("scmax.in","r");
FILE *g=fopen("scmax.out","w");
using namespace std;
vector <int> a;
vector <int> lis;
int N;
void solve ()
{
vector <int> p(a.size());
if(a.empty())
return ;
int left,right;
lis.push_back(0);
for(int i(1); i <= a.size()-1; ++i )
{
if( a[lis.back()] < a[i] )
{
p[i]=lis.back();
lis.push_back(i);
continue;
}
int mid;
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[left]] )
{
if(left) p[i]=lis[left-1];
lis[left]=i;
}
}
for(int i=lis.size(),v=lis.back();i--;v=p[v])
lis[i]=v;
}
inline void write( void )
{
fprintf(g,"%d",lis.size());
for(int i=0; i<= lis.size() -1 ;++i )
fprintf(g,"%d ",a[lis[i]]);
fclose(f);
fclose(g);
}
int main()
{
fscanf(f,"%d",&N);
int x;
for(int i(1); i <= N; ++i )
fscanf(f,"%d",&x),a.push_back(x);
solve();
write();
return 0;
}