Pagini recente » Profil deliabaltatescu | Cod sursa (job #2803586) | Cod sursa (job #1259272) | Cod sursa (job #885828) | Cod sursa (job #1384963)
#include <fstream>
#include <set>
#define n_MAX 5001
#define INF_NEG 0xa0000000
#define INF 0x5fffffff
using namespace std;
int sir[n_MAX];
int best[n_MAX];
int lengthVal[n_MAX];
int previous[n_MAX];
int binarySearch(int x, int left, int right)
{
int n = right;
int mid = (left + right) / 2;
while (left <= right)
{
if (x > sir[lengthVal[mid]] && x <= sir[lengthVal[mid+1]]) {
return mid;
} else if (x > sir[lengthVal[mid+1]]) {
left = mid + 1;
mid = (left + right) / 2;
} else /*if (x <= sir[lengthVal[mid]])*/ {
right = mid - 1;
mid = (left + right) / 2;
};
}
return n;
}
int main()
{
FILE * fin = fopen ("secv.in", "r");
FILE * fout = fopen ("secv.out", "w");
int n, i, j, sirSize = 1, uniqueNo;
set<int> uniqueSet;
fscanf(fin, "%d", &n);
for (i = 1; i <= n; ++i)
{
fscanf(fin, "%d", &sir[i]);
uniqueSet.insert(sir[i]);
}
uniqueNo = uniqueSet.size();
previous[1] = lengthVal[1] = 1;
sir[0] = INF_NEG;
for (i = 2; i <= n; ++i)
{
j = binarySearch(sir[i], 0, sirSize);
if (lengthVal[j])
{
previous[i] = previous[lengthVal[j]];
} else {
previous[i] = i;
}
if (j + 1 == uniqueNo)
best[i] = i - previous[i];
lengthVal[j+1] = i;
if (j >= sirSize)
sirSize = j+1;
}
for (i = 1, sirSize = INF; i <= n; ++i)
{
if (best[i] && best[i] < sirSize)
{
sirSize = best[i];
//j = i;
}
}
if (sirSize != INF)
fprintf(fout, "%d\n", sirSize+1);
else
fprintf(fout, "-1\n");
/*i = 0;
lengthVal[0] = j;
while (previous[lengthVal[i++]])
{
lengthVal[i] = previous[lengthVal[i - 1]];
}
for (--i; i > 0; --i)
{
fprintf(fout, "%d ", sir[lengthVal[i]]);
}
fprintf(fout, "%d\n", sir[j]);*/
fclose(fin);
fclose(fout);
return 0;
}