Cod sursa(job #1129555)

Utilizator superman_01Avramescu Cristian superman_01 Data 27 februarie 2014 23:07:26
Problema Secv Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 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() )));
	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 ;	
}