Cod sursa(job #3211960)

Utilizator profinfo114Prof Info profinfo114 Data 10 martie 2024 20:27:53
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.1 kb
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int NMAX = 5015;
vector<int> pos[NMAX];
int n,a[NMAX],dp[NMAX];
/// dp[i] = lungimea minima a unei secvente care foloseste primele norm[a[i]] elemnte
map<int, int> mp;

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

signed main()
{
    fin >> n;
    for(int i = 1; i <= n; i++){
        fin >> a[i];
        mp[a[i]] = i;
    }
    int cnt = 0;
    for(auto &it: mp){
        it.second = ++cnt;
    }
    for(int i = 1; i <= n; i++){
        a[i] = mp[a[i]];
    }
    for(int i = 1; i <= n; i++){
        if(a[i] == 1){
            pos[1].push_back(i);
            dp[i] = 1;
        }else{
            if(pos[a[i]-1].size() > 0){
                int loc = pos[a[i]-1].back();
                dp[i] = dp[loc]+(i-loc);
                pos[a[i]].push_back(i);
            }
        }
    }
    int ans = LLONG_MAX;
    for(int i = 1; i <= n; i++){
        if(a[i] == cnt && dp[i] > 0){
            ans = min(ans, dp[i]);
        }
    }
    fout << (ans == LLONG_MAX ? -1 : ans);
    return 0;
}