Cod sursa(job #1082229)

Utilizator Stefanescu_MihaiStefanescu Mihai-Nicolae Stefanescu_Mihai Data 14 ianuarie 2014 12:43:23
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <cstdio>

using namespace std;

int v[5010];

void qsort( int lo, int hi )
{
    int i = lo, y = hi, mid = lo + ( hi - lo ) / 2, t, pivot = v[mid];

    while ( i <= y )
    {
        while ( v[i] < pivot )
            ++i;

        while ( v[y] > pivot )
            --y;

        if ( i <= y )
        {
            t = v[i];
            v[i] = v[y];
            v[y] = t;

            ++i;
            --y;
        }
    }

    if ( i < hi )
        qsort( i, hi );

    if ( y > lo )
        qsort( lo, y );
}

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

    int i, n, y, maxuniq = 0, minim = 99999;

    short pd[5010], prev[5010];

    scanf( "%d\n", &n );

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


    for ( i = 1; i <= n; ++i )
    {
        pd[i] = 1;
        prev[i] = i;

        for ( y = i - 1; y; --y )
        {
                if ( ( v[y] < v[i] ) && ( pd[y] + 1 > pd[i] ) )
                {
                    pd[i] = pd[y] + 1;
                    prev[i] = prev[y];
                }
        }

        if ( ( pd[i] == maxuniq ) && ( i - prev[i] + 1 < minim ) )
        {
            minim = i - prev[i] + 1;
        }
        else
        {
            if ( pd[i] > maxuniq )
            {
                maxuniq = pd[i];
                minim = i - prev[i] + 1;
            }
        }
    }

    qsort( 1, n );

    int k = 0;

    for ( i = 1; i <= n; ++i )
    {
        while ( v[i] == v[i+1] )
            ++i;

        ++k;
    }

    if ( k == maxuniq )
        printf( "%d\n", minim );
    else
        printf( "-1\n" );


    fclose( stdin );
    fclose( stdout );

    return 0;
}