Cod sursa(job #1861906)

Utilizator NicusorTelescu Nicolae Nicusor Data 29 ianuarie 2017 13:19:20
Problema Secv Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct pereche
{
    int valoare,indice,urmator;
}v[5005];

int lmin=5001,numere[5001],cnt_max,n;

bool cmp(const pereche &a,const pereche &b)
{
    if (a.valoare==b.valoare)
        return a.indice<b.indice;
    return a.valoare<b.valoare;
}

void functie(int indice1,int nr,int lung)
{
    int in=1,sf=n,mij,gasit=0;
    if (v[indice1].urmator!=0)
        gasit=v[indice1].urmator;
    else
        while (in<=sf)
        {
            mij=(in+sf)/2;
            if (v[mij].valoare<numere[nr])
                in=mij+1;
            if (v[mij].valoare>numere[nr])
                sf=mij-1;
            if (v[mij].valoare==numere[nr])
            {
                if (v[mij].indice>v[indice1].indice)
                    gasit=mij, sf=mij-1;
                if (v[mij].indice<v[indice1].indice)
                    in=mij+1;
            }
        }
    if (gasit!=0)
    {
        v[indice1].urmator=gasit;
        int lungime=lung+v[gasit].indice-v[indice1].indice;
        if (nr==cnt_max)
        {
            if (lungime<lmin)
                lmin=lungime;
        }
        else functie(gasit,nr+1,lungime);
    }
}

int main()
{
    freopen("secv.in","r",stdin);
    freopen("secv.out","w",stdout);
    scanf("%d ",&n);
    for (int i=1;i<=n;++i)
        scanf("%d ",&v[i].valoare), v[i].indice=i;
    sort(v+1,v+n+1,cmp);
    v[0].valoare=-1;
    for (int i=1;i<=n;++i)
        if (v[i].valoare!=v[i-1].valoare)
            cnt_max++, numere[cnt_max]=v[i].valoare;
    for (int i=1;v[i].valoare==numere[1];++i)
        functie(i,2,1);
    if (n==1)
        printf("1");
    else
    {
        if (lmin!=5001)
            printf("%d",lmin);
        else printf("-1");
    }
}