Cod sursa(job #2631126)

Utilizator PatrickCplusplusPatrick Kristian Ondreovici PatrickCplusplus Data 29 iunie 2020 06:31:16
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.83 kb
#include <bits/stdc++.h>

using namespace std;

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

const int nmax = 5000;
int n, v[nmax + 5], nextt[nmax + 5];
vector <int> p[nmax + 5];

struct elem
{
    int val, poz;
}v2[nmax + 5];

bool cmp(elem a, elem b)
{
    if (a.val == b.val)
    {
        return a.poz < b.poz;
    }
    return a.val < b.val;
}

int main()
{
    fin >> n;
    if (n == 0)
    {
        fout << -1;
        return 0;
    }
    for (int i = 1; i <= n; ++i)
    {
        fin >> v[i];
        v2[i] = {v[i], i};
    }
    sort(v2 + 1, v2 + n + 1, cmp);
    int z = 0;
    for (int i = 1; i <= n; ++i)
    {
        if (i == 1) ++z;
        else if (v2[i].val > v2[i - 1].val) ++z;
        v[v2[i].poz] = z;
        p[z].push_back(v2[i].poz);
    }
    for (int i = 1; i <= n; ++i)
    {
        if (v[i] == z) nextt[i] = i;
    }
    int minim = nmax + 5;
    for (int i = z - 1; i >= 1; --i)
    {
        for (auto pos : p[i])
        {
            int st = 0, dr = p[i + 1].size() - 1, ans = -1;
            while (st <= dr)
            {
                int mid = (st + dr) / 2;
                if (p[i + 1][mid] > pos)
                {
                    ans = p[i + 1][mid];
                    dr = mid - 1;
                }
                else
                {
                    st = mid + 1;
                }
            }
            if (ans == -1) nextt[pos] = ans;
            else nextt[pos] = nextt[ans];
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        if (v[i] == 1)
        {
            if (nextt[i] != -1)
            {
                minim = min(minim, nextt[i] - i + 1);
            }
        }
    }
    if (minim == nmax + 5) minim = -1;
    fout << minim;
    fin.close();
    fout.close();
    return 0;
}