Cod sursa(job #2871841)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 15 martie 2022 20:31:37
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <algorithm>
#include <fstream>
#define MAX 5001
using namespace std;

ifstream cin( "secv.in" );
ofstream cout( "secv.out" );

struct Andrei {
    int val, poz;
};

bool cmp( const Andrei& a, const Andrei& b ) {
    return ( a.val < b.val );
}

Andrei a[ MAX + 1 ];
int poz[ MAX + 1 ];
int dp[ MAX + 1 ];
int v[ MAX + 1 ];
int n;

int main()
{
    cin >> n;
    for( int i = 1; i <= n; i++ ) {
        cin >> a[ i ].val;
        a[ i ].poz = i;
    }

    sort( a + 1, a + n + 1, cmp );

    int no = 1;
    v[ a[ 1 ].poz ] = no;
    for( int i = 2; i <= n; i++ )
        if( a[ i ].val != a[ i - 1 ].val )
            v[ a[ i ].poz ] = ++no;
        else v[ a[ i ].poz ] = no;

    int rez = ( 1 << 30 );
    for( int i = 1; i <= n; i++ ) {
        poz[ v[ i ] ] = i;
        if( v[ i ] == 1 )
            dp[ i ] = 1;
        else dp[ i ] = ( dp[ poz[ v[ i ] - 1 ] ] + i - poz[ v[ i ] - 1 ] ) * ( dp[ poz[ v[ i ] - 1 ] ] > 0 );

        if( v[ i ] == no && dp[ i ] != 0 )
            rez = min( rez, dp[ i ] );
    }
    if( rez == ( 1 << 30 ) )
        cout << "-1\n";
    else cout << rez << '\n';
    return 0;
}