Cod sursa(job #764735)

Utilizator informatician28Andrei Dinu informatician28 Data 6 iulie 2012 00:43:10
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.74 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define DIM 5001
#define INF 0x3f3f3f3f
#define pb push_back

using namespace std;

int N, V[DIM], father[DIM], best[DIM], lmax, Sol;
vector< int > elements;

void Read()
{
    freopen("secv.in", "r", stdin);
    scanf("%d", &N);
    for (int i = 1; i <= N; i++)
    {
        scanf("%d", &V[i]);
        elements.pb(V[i]);
    }
    sort(elements.begin(), elements.end());
    elements.erase( unique(elements.begin(), elements.end()), elements.end());
}

void Solve()
{
    int i, j;

    for (i = 1; i <= N; i++)
    {
        father[i] = i;
        best[i] = 1;
    }
    for (i = 1; i <= N; i++)
    {
        for (j = i-1; j >= 1; j--)
        {
            if (V[j] < V[i])
            {
                if (best[j] + 1 == best[i])
                {
                    father[i] = max(father[i], father[j]);
                }
                else if (best[j] + 1 > best[i])
                {
                    best[i] = best[j] + 1;
                    father[i] = father[j];
                }
            }
        }
        if (best[i] > lmax)
        {
            lmax = best[i];
        }
    }
}
int length (int pos)
{
    if (best[pos] == 1)
    {
        return 1;
    }
    return length(father[pos]) + pos - father[pos];
}

void Print()
{
    freopen("secv.out", "w", stdout);
    printf("%d\n", Sol);
}
int main()
{
    Read();
    Solve();
    if (lmax != elements.size())
    {
        Sol = -1;
        Print();
        return 0;
    }
    Sol = INF;
    for (int i = 1; i <= N; i++)
    {
        if (best[i] == lmax)
        {
            Sol = min(Sol, length(i));
        }
    }
    Print();
    return 0;
}