Cod sursa(job #1129556)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2014 23:08:02
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>
 
#define INF 0x3f3f3f3f
#define NMAX 5005
#define NNMAX 2000000005
#define get_max(a,b) ((a)>(b)?(a):(b))
#define get_min(a,b) ((a)<(b)?(a):(b))
#define f first
#define s second
 
using namespace std;
typedef vector < int > ::iterator vii;
 
ifstream in ( "secv.in" );
ofstream out ( "secv.out" );
 
pair < int , int > DP[NMAX];
vector < int > B;
int  A[NMAX] , N , Answer, Next[NMAX]; 
 
int main ( void )
{
    int i , j ;
    in >> N ;
    for ( i = 1 ; i <= N ; ++i ) in >>A[i] , B.push_back( A[i] );
    sort ( B.begin() , B.end() );
    B.resize ( distance ( B.begin() , unique( B.begin() , B.end() )));
    vii last_pos = B.end() ; --last_pos;
    for ( i = 1 ; i <= N ; ++i )
    {
        for ( vii it = B.begin() ; it != B.end() ; ++it ) 
            if( *it == A[i] ) 
                {
                    Next[i] = *(it+1);
                    break;
                }
    }
    for ( i = 0 ; i <= N and A[i+1] < *B.begin() ; ++i);
    for (++i ; i <= N ; ++i )
    {
        if ( A[i] == *B.begin() ) DP[i].second = i , DP[i].first = 1  ;
        for ( j = i + 1 ; j <= N ; ++j  )
           if ( A[j] == Next[i] )
           {
               DP[j].first = DP[i].first + 1;
               DP[j].second = DP[i].second;
           }
    }
    Answer = INF;
    for ( i = 1 ; i <= N ; ++i )
        if ( A[i] == *last_pos and DP[i].first  == B.size() )
            Answer = get_min( Answer , i - DP[i].second +1 );
    out << ( Answer != INF ? Answer : -1) << "\n";
    in.close();
    out.close();
    return 0 ;  
}