Pagini recente » Cod sursa (job #1788933) | Cod sursa (job #157974) | Cod sursa (job #1162128) | Cod sursa (job #2801946) | Cod sursa (job #1183545)
#include <fstream>
#include <unordered_map>
#include <algorithm>
#define I "secv.in"
#define O "secv.out"
#define DIM 5055
std::ifstream is (I);
std::ofstream os (O);
int N, V[DIM], D[DIM], Lmax, S[DIM], sol = (1<<20);
std::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 (auto it = M.begin(); it != M.end(); ++it, ++k)
S[k] = it->first;
--k;
std::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;
}
};