Cod sursa(job #2097117)

Utilizator andreicoman299Coman Andrei andreicoman299 Data 30 decembrie 2017 15:56:39
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
#define MAXN 5000

struct S{
    int val;
    int ind;
}v[1 + MAXN];
bool cmp(S A, S B){
    return A.val < B.val;
}
bool cmp2(S A, S B){
    return A.ind < B.ind;
}
std::vector <int> V[1 + MAXN];
int st[1 + MAXN];

int main(){
    FILE*fi,*fo;
    fi = fopen("secv.in","r");
    fo = fopen("secv.out","w");

    int n;
    fscanf(fi,"%d", &n);
    for(int i = 1; i <= n; i++){
        fscanf(fi,"%d", &v[i].val);
        v[i].ind = i;
    }
    std::sort(v + 1, v + n + 1, cmp);
    int prev = 0;
    for(int i = 1; i <= n; i++){
        if(v[i].val == prev)
            v[i].val = v[i - 1].val;
        else{
            prev = v[i].val;
            v[i].val = v[i - 1].val + 1;
        }
    }
    int last = v[n].val, ok = 1, min = 1000000000;
    std::sort(v + 1, v + n + 1, cmp2);
    for(int i = 1; i <= n; i++)
        V[v[i].val].push_back(i);

    for(int i = 1; i <= n; i++){
        prev = i;
        for(int j = 1; j <= last; j++){
            while(st[j] < V[j].size() && V[j][st[j]] < prev) st[j]++;
            if(st[j] == V[j].size()) ok = 0;
            prev = V[j][st[j]];
        }
        if(ok && V[last][st[last]] - i + 1 < min) min = V[last][st[last]] - i + 1;
    }
    fprintf(fo,"%d", min);

    fclose(fi);
    fclose(fo);
    return 0;
}