Cod sursa(job #1183545)

Utilizator japjappedulapPotra Vlad japjappedulap Data 9 mai 2014 17:05:37
Problema Secv Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <fstream>
#include <unordered_map>
#include <algorithm>
#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::unordered_map<int,bool> M;

int BKPT(int i, int j);

int main()
{
    is >> N;
    for (int i = 1; i <= N; ++i)
    {
        is >> V[i];
        M[V[i]]=1;
    }
    int k = 1;
    for (auto it = M.begin(); it != M.end(); ++it, ++k)
        S[k] = it->first;
    --k;
    std::sort(S+1, S+k+1);
    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 != k)
        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;
    }

};