Cod sursa(job #2650352)

Utilizator alexradu04Radu Alexandru alexradu04 Data 18 septembrie 2020 14:48:25
Problema Secv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <cstdio>
#include <map>

using namespace std;
int v[50005];
int prevPos[50005];
int lastPos[50005];
int dp[50005];
map<int, int> c;
map<int, int> fr;

int main() {
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    int n;
    scanf("%d", &n);
    if(n==1) {
        printf("1");
        return 0;
    }
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &v[i]);
    }
    for (int i = 1; i <= n; ++i) {
        if (fr[v[i]] == 0) {
            c[v[i]]++;
            fr[v[1]] = 1;
        }
    }
    int pos = 0;
    for (auto it : c) {
        ++pos;
        fr[it.first] = pos;
    }
    for (int i = 1; i <= n; ++i) {
        v[i] = fr[v[i]];
        if (v[i] == 1) {
            prevPos[i] = i;
        } else
            prevPos[i] = lastPos[v[i] - 1];
        lastPos[v[i]] = i;
    }
    int minn = 1e9;
    for (int i = 1; i <= n; ++i) {
        if (prevPos[i]) {
            dp[i] = dp[prevPos[i]] + i - prevPos[i];
        } else
            dp[i] = 1e9;
        if (v[i] == c.size())
            minn = min(minn, dp[i]);
    }
    if (minn == 1e9) {
        printf("-1");
    }
    printf("%d", minn + 1);
    return 0;
}