Cod sursa(job #789433)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 18 septembrie 2012 00:30:32
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <iostream>
#include <fstream>
#include <set>
#include <map>
#include <algorithm>

using namespace std;

#define INF (1 << 30)

ifstream fi("secv.in");
ofstream fo("secv.out");

int *V, N;
int vmax;

void read()
{
    fi >> N;
    V = new int[N];
    for(int i = 0; i < N; i++)
        fi >> V[i];
}

void normalize()
{
    set<int> s;
    map<int, int> m;
    for(int i = 0; i < N; i++)
        s.insert(V[i]);

    vmax = s.size() - 1;
    int i = 0;
    for(set<int>::iterator it = s.begin(); it != s.end(); it++)
        m[*it] = i++;

    for(int i = 0; i < N; i++)
    {
        V[i] = m[V[i]];
//        cout << V[i] << " ";
    }
//    cout << endl << "Max = " << vmax << endl;
}

int solve()
{
    int result = INF;
    int *poz = new int[vmax + 1];
    for(int i = 0; i <= vmax; i++)
        poz[i] = INF;
    int *X = new int[N];
    for(int i = N - 1; i >= 0; i--)
    {
        if(V[i] == vmax)
        {
            poz[vmax] = i;
            X[i] = 1;
        }
        else
        {
            // V[i] cuprins intre 0 si vmax - 1 (inclusiv)
            int succ = V[i] + 1;
            if(poz[succ] == INF)
                X[i] = INF;
            else
            {
                X[i] = poz[succ] - i + X[poz[succ]];
                poz[V[i]] = i;
            }
        }
    }

    for(int i = 0; i < N; i++)
        if(V[i] == 0)
            result = min(result, X[i]);

    if(result == INF)
        result = -1;

    return result;
}

int main(int argc, char *argv[])
{
    read();
    normalize();
    fo << solve() << endl;
    return 0;
}