Cod sursa(job #2561449)

Utilizator Radu_FilipescuFilipescu Radu Radu_Filipescu Data 28 februarie 2020 20:02:24
Problema Subsir 2 Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#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;
}