Pagini recente » Cod sursa (job #959913) | Cod sursa (job #1469854) | Cod sursa (job #2554041) | Cod sursa (job #3271376) | Cod sursa (job #789433)
Cod sursa(job #789433)
#include <iostream>
#include <fstream>
#include <set>
#include <map>
#include <algorithm>
using namespace std;
#define INF (1 << 30)
ifstream fi("secv.in");
ofstream fo("secv.out");
int *V, N;
int vmax;
void read()
{
fi >> N;
V = new int[N];
for(int i = 0; i < N; i++)
fi >> V[i];
}
void normalize()
{
set<int> s;
map<int, int> m;
for(int i = 0; i < N; i++)
s.insert(V[i]);
vmax = s.size() - 1;
int i = 0;
for(set<int>::iterator it = s.begin(); it != s.end(); it++)
m[*it] = i++;
for(int i = 0; i < N; i++)
{
V[i] = m[V[i]];
// cout << V[i] << " ";
}
// cout << endl << "Max = " << vmax << endl;
}
int solve()
{
int result = INF;
int *poz = new int[vmax + 1];
for(int i = 0; i <= vmax; i++)
poz[i] = INF;
int *X = new int[N];
for(int i = N - 1; i >= 0; i--)
{
if(V[i] == vmax)
{
poz[vmax] = i;
X[i] = 1;
}
else
{
// V[i] cuprins intre 0 si vmax - 1 (inclusiv)
int succ = V[i] + 1;
if(poz[succ] == INF)
X[i] = INF;
else
{
X[i] = poz[succ] - i + X[poz[succ]];
poz[V[i]] = i;
}
}
}
for(int i = 0; i < N; i++)
if(V[i] == 0)
result = min(result, X[i]);
if(result == INF)
result = -1;
return result;
}
int main(int argc, char *argv[])
{
read();
normalize();
fo << solve() << endl;
return 0;
}