Cod sursa(job #2277299)

Utilizator Y0da1NUME JMECHER Y0da1 Data 5 noiembrie 2018 23:21:42
Problema Secv Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.6 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <set>
#include <vector>

#define maxn 5005
using namespace std;

int N;
//int v[maxn];

//int best[maxn];
//int pos[maxn];
int nr_diff = 0;

set <int> aparitii;
vector <int> siruri;

vector <pair<int, int> > a, d(maxn);      ///d[i] - ultimul element al lisului cu i elemente;
int lis;
int prv[maxn];

int cautbin(int nr, int b, int e)
{
    int mid = (b + e)/2;
    while(b < e)
    {
    mid = (b + e)/2;
        if(d[mid].first >= nr)
            e = mid;
        else
            b = mid + 1;
    }
    return b;
}

int main()
{
    ifstream in ("secv.in");
    ofstream out ("secv.out");
    int lgmin = 0x7fffffff;

    in>>N;
    a.push_back({0, 0}); //dummy ca sa inceapa de al 1
    for(int i = 1; i <= N; ++i)
    {

        int cv;
        in>>cv;
        a.push_back({cv, i});


        //cout<<a[i].first<<" ";
        if(aparitii.find(a[i].first) == aparitii.end())
        {
            ++nr_diff;
            aparitii.insert(a[i].first);
        }
    }

    if(nr_diff == 1)
    {
        out<<"1\n";
        return 0;
    }

    /*for(int i = 0; i <= N; ++i)
    {
        best[i] = 1;
        pos[i] = -1;
    }
    for(int i = N - 1; i > 0; --i)
    {
        for(int j = i + 1; j <= N; ++j)
            if(v[i] < v[j] && best[i]<best[j]+1)
            {
            best[i] = best[j] + 1;
            pos[i] = j;
            if(best[i] == nr_diff)
                {
                    siruri.push_back(i);
                    //cout<<i<<"\n";
                }
            }
    }*/
    lis = 1;    ///lungimea maxima a subsirului
    d[lis] = a[1];

    for (int i = 2; i <= N; ++i)
    {
        if(a[i].first > d[lis].first)
		{
		    ++lis;
			d[lis] = a[i];
			prv[a[i].second] = d[lis-1].second;
			if(lis == nr_diff)
                siruri.push_back(i);
		}
		else
		{
		    int lo = cautbin(a[i].first, 1, lis);
		    d[lo] = a[i];
		    prv[a[i].second] = d[lo-1].second;
		    if(lo == nr_diff)
                siruri.push_back(i);
        }

    }
    if(siruri.empty())
    {
        out<<"-1\n";
        return 0;
    }
    //cout<<"AFIS!";
    for(int i = 0; i < siruri.size(); ++i)
    {

        int capat = siruri[i];
        while(1)
        {
            //cout<<capat<<"\n";
            if(prv[capat])
                capat = prv[capat];
            else
                break;
        }
;
        if(siruri[i] - capat < lgmin)
            lgmin = siruri[i] - capat;
    }
    out<<lgmin + 1<<"\n";
    return 0;
}