Pagini recente » Cod sursa (job #2061730) | Cod sursa (job #2066104) | Cod sursa (job #121473) | Cod sursa (job #89340) | Cod sursa (job #3125042)
#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] << " ";
}
}
if (ind == 0)
{
cout << -1;
return 0;
}
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;
}