Cod sursa(job #1183498)

Utilizator japjappedulapPotra Vlad japjappedulap Data 9 mai 2014 14:51:09
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <set>
#define I "secv.in"
#define O "secv.out"
#define DIM 5055

std::ifstream is (I);
std::ofstream os (O);

int N, V[DIM], D[DIM], Lmax, S[DIM], sol = (1<<20);

std::set<int> Sx;

int BKPT(int i, int j);

int main()
{
    is >> N;
    for (int i = 1; i <= N; ++i)
    {
        is >> V[i];
        if (Sx.find(V[i]) == Sx.end())
            Sx.insert(V[i]);
    }
    int k = 1;
    for (std::set<int> :: iterator it = Sx.begin(); it != Sx.end(); ++it, ++k)
        S[k] = *it;
    for (int i = 1; i <= N; ++i)
    {
        D[i] = 1;
        for (int j = i-1; j >= 1; --j)
            if (V[j] < V[i] && D[j]+1 > D[i])
                D[i] = D[j]+1;
        if (D[i] > Lmax) Lmax = D[i];
    }
    if (Lmax != Sx.size())
    {
        os << -1;
    }
    else
    {
        int j = 0;
        for (int i = 1; i <= N; ++i)
            if (D[i] == Lmax && V[i] == S[Lmax])
            {
                j = BKPT(i, Lmax);
                if (i-j+1 < sol)
                    sol = i-j+1;
            }
    }
    if (sol == (1<<20))
        os << -1;
    else
        os << sol;
    is.close();
    os.close();
}

int BKPT(int i, int j)
{
    if (V[i] == S[1]) return i;
    while (1)
    {
        if (V[i] == S[j-1] && D[i] == j-1) return BKPT(i, j-1);
        --i;
    }

};