Cod sursa(job #2650069)

Utilizator redstonegamer22Andrei Ion redstonegamer22 Data 17 septembrie 2020 14:16:06
Problema Secv Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

unordered_map<int, int> hm;
vector<int> elems;
int v[5005];
int last[5005];
int ptr[5005];
int sum[5005];

int main()
{
    int n; in >> n;

    for(int i = 0; i < n; i++)
        in >> v[i];

    for(int i = 0; i < n; i++)
    {
        if(hm[v[i]] == 0)
        {
            hm[v[i]] = 1;
            elems.push_back(v[i]);
        }
    }

    sort(elems.begin(), elems.end());

    for(int i = 0; i < n; i++)
    {
        hm[elems[i]] = i;
    }

    for(int i = 0; i < n; i++)
    {
        v[i] = hm[v[i]];
        //cout << v[i] << " " ;
    }
    //cout << endl;

    for(int i = 0; i < 5005; i++) last[i] = -1;

    //cout << last[0] << endl << endl;

    for(int i = 0; i < n; i++)
    {
        int elem = v[i];

        //cout << elem << " ";

        if(elem == 0) ptr[i] = i;
        else ptr[i] = last[elem-1];
        last[elem] = i;

        //cout << ptr[i] << endl;
    }

    int minim = 1000000;
    for(int i = 0; i < n; i++)
    {
        if(ptr[i] != -1)
            sum[i] = sum[ptr[i]] + (i - ptr[i]);
        else
            sum[i] = 1000000;

        if(v[i] == elems.size()-1)
            minim = min(minim, sum[i]);
    }

    if(minim == 1000000) out << "-1";
    else out << minim+1;
}