Pagini recente » Cod sursa (job #1087288) | Statisticile problemei Politie | Cod sursa (job #2986043) | Cod sursa (job #2451290) | Cod sursa (job #2561449)
#include <bits/stdc++.h>
using namespace std;
ifstream fin( "subsir2.in" );
ofstream fout( "subsir2.out" );
const int NMAX = 5005;
const int INF = 2000000000;
int N;
int a[NMAX];
int lis[NMAX];
int pre[NMAX];
bool prost[NMAX];
void Read()
{
fin >> N;
for( int i = 1; i <= N; ++i )
fin >> a[i];
}
void Remake( int p ) {
fout << N - p + 1 << ' ';
if( pre[p] != p ) Remake( pre[p] );
}
void Do()
{
int lismax = 0;
for( int i = 1; i <= N; ++i ) {
lis[i] = 1;
for( int j = 1; j < i; ++j )
if( a[j] < a[i] && lis[j] + 1 > lis[i] )
lis[i] = lis[j] + 1;
lismax = max( lismax, lis[i] );
}
for( int i = 1; i <= N / 2; ++i )
swap( a[i], a[N - i + 1] );
for( int i = 1; i <= N; ++i ) {
lis[i] = 1;
pre[i] = i;
for( int j = 1; j < i; ++j )
if( a[j] >= a[i] && ( lis[j] + 1 > lis[i] || ( lis[j] + 1 == lis[i] && a[ pre[i] ] > a[j] )) ) {
lis[i] = lis[j] + 1;
pre[i] = j;
}
}
for( int i = 1; i <= N; ++i )
if( pre[i] != i )
prost[ pre[i] ] = true;
int pos = -1;
for( int i = 1; i <= N; ++i )
if( !prost[i] )
if( lis[i] == lismax && ( pos == -1 || a[pos] > a[i] ) ) pos = i;
/*for( int i = 1; i <= N; ++i )
fout << a[i] << ' '; fout << '\n';
for( int i = 1; i <= N; ++i )
fout << lis[i] << ' ';*/
fout << lismax << '\n';
Remake( pos );
}
int main()
{
Read();
Do();
return 0;
}