Pagini recente » Cod sursa (job #319569) | Cod sursa (job #1631954) | Cod sursa (job #916735) | Cod sursa (job #3149901) | Cod sursa (job #1184506)
#include <fstream>
#include <unordered_map>
#include <algorithm>
using namespace std;
#define I "secv.in"
#define O "secv.out"
#define DIM 5055
ifstream is (I);
ofstream os (O);
int N, V[DIM], D[DIM], Lmax, S[DIM], sol = (1<<20);
unordered_map<int,bool> M;
int BKPT(int i, int j);
int main()
{
is >> N;
for (int i = 1; i <= N; ++i)
{
is >> V[i];
M[V[i]]=1;
}
int k = 1;
for (unordered_map<int,bool>::iterator it = M.begin(); it != M.end(); ++it, ++k)
S[k] = it->first;
--k;
sort(S+1, S+k+1);
for (int i = 1; i <= N; ++i)
{
D[i] = 1;
for (int j = i-1; j >= 1; --j)
if (V[j] < V[i] && D[j]+1 > D[i])
D[i] = D[j]+1;
if (D[i] > Lmax) Lmax = D[i];
}
if (Lmax != k)
os << -1;
else
{
int j = 0;
for (int i = 1; i <= N; ++i)
if (D[i] == Lmax && V[i] == S[Lmax])
{
j = BKPT(i, Lmax);
if (i-j+1 < sol)
sol = i-j+1;
}
}
if (sol == (1<<20))
os << -1;
else
os << sol;
is.close();
os.close();
}
int BKPT(int i, int j)
{
if (V[i] == S[1]) return i;
while (1)
{
if (V[i] == S[j-1] && D[i] == j-1) return BKPT(i, j-1);
--i;
}
};