Cod sursa(job #1327043)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 26 ianuarie 2015 12:29:52
Problema Secv Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define MAXN 5000
using namespace std;

struct nr{
    int val, pos;
};
typedef vector <int> list;

nr v[MAXN + 1];
int D[MAXN + 1];
list P[MAXN + 1];

bool comp_val(nr a, nr b) {
    return a.val < b.val;
}
bool comp_pos(nr a, nr b) {
    return a.pos < b.pos;
}


int main () {
    ifstream cin("secv.in");
    ofstream cout("secv.out");

    int n;
    cin >> n;

    for (int i = 0 ; i < n ; ++i) {
        cin >> v[i].val;
        v[i].pos = i;
    }

    sort(v, v + n, comp_val);

    int x = v[0].val, normal = 0;
    for (int i = 0 ; i < n ; ++i) {
        if (v[i].val == x)
            v[i].val = normal;
        else {
            ++normal;
            x = v[i].val;
            v[i].val = normal;
        }
    }

    sort(v, v + n, comp_pos);

    int maxval = -1, sol = 0;
    for (int i = 0 ; i < n ; ++i) {
        P[v[i].val].push_back(i);
        if (v[i].val == 0)
            D[i] = 1;
        else {
            int want = v[i].val - 1;
            int minlen = 0, p;
            for (int j = 0 ; j < P[want].size() ; ++j)
                if (D[P[want][j]] > 0 && (minlen == 0 || D[P[want][j]] < minlen)) {
                    minlen = D[P[want][j]];
                    p = P[want][j];
                }

            if (minlen) D[i] = minlen + (i - p);
        }
        if (v[i].val > maxval) {
            maxval = v[i].val;
            sol = D[i];
            }
        else if (v[i].val == maxval && D[i] < sol) {
            sol = D[i];
        }
    }

    if (sol) cout << sol << "\n";
    else
        cout << "-1\n";
    return 0;
}