Cod sursa(job #2593444)

Utilizator FrostfireMagirescu Tudor Frostfire Data 3 aprilie 2020 21:03:26
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#define NMAX 5000

using namespace std;

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

int n, v[NMAX+10], a[NMAX+10], dp[NMAX+10], dp1[NMAX+10], sol[NMAX+10], last[NMAX+10], ans, k, nr;

int binSearch(int val)
{   int st = 1, dr = k, sol = 0;
    while(st <= dr)
        {   int mij = (st + dr) / 2;
            if(val <= dp[mij]) sol = mij, dr = mij - 1;
            else st = mij + 1;
        }
    return sol;
}

int main()
{
    f >> n;
    for(int i=1; i<=n; i++) f >> v[i], a[i] = v[i];
    sort(a+1, a+n+1);
    nr = 1;
    for(int i=2; i<=n; i++) if(a[i] != a[i-1]) nr++;
    dp[++k] = v[1];
    sol[1] = 1;
    for(int i=2; i<=n; i++)
        {   if(v[i] > dp[k]) dp[++k] = v[i], sol[i] = k;
            else
                {   int poz = binSearch(v[i]);
                    dp[poz] = v[i];
                    sol[i] = poz;
                }
        }
    if(k < nr)
        {   g << -1 << '\n';
            return 0;
        }
    if(k == 1)
        {   g << 1 << '\n';
            return 0;
        }
    ans = 5005;
    for(int i=1; i<=n; i++)
        {   if(sol[i] == 1) last[1] = i, dp1[i] = 1;
            else
                {   last[sol[i]] = i;
                    if(last[sol[i]-1]) dp1[i] = dp1[last[sol[i]-1]] + i - last[sol[i]-1];
                    if(sol[i] == nr) ans = min(ans, dp1[i]);
                }
        }
    g << ans << '\n';
    return 0;
}