Cod sursa(job #764552)

Utilizator tzipleatudTudor Tiplea tzipleatud Data 5 iulie 2012 16:16:57
Problema Secv Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <algorithm>
#include <vector>
#define N 5010

using namespace std;

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

int n,i,V[N],j,ANS=99999;
vector <int> A[N],B,S;

int SearchP (int x)
{
    int p=0,u=S.size()-1,m;
    while (p<=u)
    {
        m=(p+u)/2;
        if (S[m]==x) return m;
        if (S[m]<x) p=m+1;
            else u=m-1;
    }
    return 0;
}

int Search (vector<int> &A, int x)
{
    int p=0,u=A.size()-1,m,ANS=-999;
    while (p<=u)
    {
        m=(p+u)/2;
        if (A[m]>=x)
        {
            ANS=A[m];
            u=m-1;
        }
        else p=m+1;
    }
    return ANS;
}

int Solve (int p)
{
    int m=p+1;
    for (int j=1;j<S.size();j++)
    {
        m=Search(A[j],m)+1;
        if (m<0) return 999999;
    }
    return m-p;
}

int main ()
{
    f >> n;
    for (i=1;i<=n;i++)
    {
        f >> V[i];
        B.push_back(V[i]);
    }
    sort(B.begin(),B.end());
    S.push_back(B[0]);
    for (i=1;i<B.size();i++)
        if (B[i]!=B[i-1])
            S.push_back(B[i]);
    for (i=1;i<=n;i++)
        A[SearchP(V[i])].push_back(i);
    for (i=0;i<A[0].size();i++)
        ANS=min(ANS,Solve(A[0][i]));
    g << ANS << '\n';
    f.close();g.close();
    return 0;
}