Cod sursa(job #3124340)

Utilizator TaniaKallosKallos Tania TaniaKallos Data 27 aprilie 2023 22:34:35
Problema Secv Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <fstream>
#include <vector>
#include <map>

using namespace std;


ifstream cin("secv.in");
ofstream cout("secv.out");


const int N = 5000;
int n, nr;
int v[N+1], v2[N+1];
vector <int> dp[N+1][2]; /// 0->p, 1->u
map <int, int> mp;


int cb(int st, int dr, int val, int poz) /// <
{
    while (st <= dr)
    {
        int mij = (st+dr)/2;
        if (val <= dp[poz][1][mij])
            dr = mij-1;
        else
            st = mij+1;
    }
    return dr;
}


int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> v[i];
    

    for (int i = 1; i <= n; i++)
    {
        if (mp.find( v[i] ) == mp.end())
            mp[ v[i] ] = 1;
    }

    for (map <int, int> :: iterator it = mp.begin(); it != mp.end(); it++)
    {
        v2[++nr] = it->first;
        it->second = nr;
    }
    

    for (int i = 1; i <= n; i++)
    {
        dp[ mp[v[i]] ][1].push_back( i );
        dp[ mp[v[i]] ][0].push_back( 0 );
    }
    

    for (int i = 0; i < dp[1][0].size(); i++)
    {
        dp[1][0][i] = dp[1][1][i];
        //cout << dp[1][0][i] << ' ';
    }
    //cout << '\n';
    
    for (int i = 2; i <= nr; i++)
    {
        for (int j = 0; j < dp[i][0].size(); j++)
        {
            int poz = cb(0, dp[i-1][0].size()-1, dp[i][1][j], i-1);
            if (poz >= 0)
                dp[i][0][j] = dp[i-1][0][poz];
            else
                dp[i][0][j] = n+1;
        }

        int ind = 0;
        for (int j = 0; j < dp[i][0].size(); j++)
        {
            if (dp[i][0][j] != n+1)
            {
                dp[i][0][ind] = dp[i][0][j];
                dp[i][1][ind] = dp[i][1][j];
                ind++;
                //cout << dp[i][0][ind-1] << ' ' << dp[i][1][ind-1] << "   ";
            }
        }
        dp[i][0].resize(ind);
        dp[i][1].resize(ind);

        //cout << '\n';
    }


    int mini = N+1;
    for (int i = 0; i < dp[nr][0].size(); i++)
        mini = min( mini, dp[nr][1][i] - dp[nr][0][i] + 1 );
    
    cout << mini;


    return 0;
}