Cod sursa(job #1729997)

Utilizator silkMarin Dragos silk Data 16 iulie 2016 00:15:08
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <algorithm>
#define NMax 5005
#define INF 1<<30
using namespace std;

int sum[NMax];
int pos[NMax];
int e[NMax];
int v[NMax];
int start,n;

void Prelucrare()
{
     // Prelucram sirul
    int i,j,st,mid,dr;

    sort( e + 1, e + 1 + n );

    for( i = 1; i <= n; )
    {
        for( j = i + 1; j <= n && e[i] == e[j]; ++j )
        e[j] = -1;

    i = j;
    }

    sort( e + 1, e + 1 + n );

    start = 1;
    while( e[start] == -1 ) ++start;
    --start;

    for( i = 1; i <= n; ++i )
        for( st = start + 1, dr = n; st <= dr; )
        {
            mid = (st + dr)/2;
            if( v[i] > e[mid] ) st = mid + 1;
            else if( v[i] < e[mid] ) dr = mid - 1;
            else { v[i] = mid - start; break; }
        }
}

int main(){
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);

    int i,ans=INF,ok;

    scanf("%d",&n);
    for( i = 1; i <= n; ++i )
    {
        scanf("%d",&v[i]);
        e[i] = v[i];
    }


    Prelucrare();
    for( i = 1; i <= n; ++i )
    {
        if( v[i] == 1 ) pos[ v[i] ] = i;
        else if( pos[ v[i] - 1 ] )
        {
            pos[ v[i] ] = i;
            sum[i] = pos[ v[i] ] - pos[ v[i] - 1 ] + sum[ pos[ v[i] - 1 ] ];
        }
    }


    for( ok = 0, i = 1; i <= n; ++i )
    if( ans > sum[i] + 1 && v[i] == n - start && sum[i] )
    { ans = sum[i] + 1; ok = 1; }

    if( n - start == 1 ) printf("1\n");
    else if( !ok ) printf("-1\n");
    else printf("%d\n",ans);



return 0;
}