Pagini recente » Borderou de evaluare (job #1374423) | Cod sursa (job #1384701)
#include <fstream>
#define n_MAX 100001
#define INF_NEG 0xa0000000
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 ("scmax.in", "r");
FILE * fout = fopen ("scmax.out", "w");
int n, i, j, sirSize = 1;
fscanf(fin, "%d", &n);
for (i = 1; i <= n; ++i)
{
fscanf(fin, "%d", &sir[i]);
}
best[1] = lengthVal[1] = 1;
sir[0] = INF_NEG;
for (i = 2; i <= n; ++i)
{
j = binarySearch(sir[i], 0, sirSize);
previous[i] = lengthVal[j];
best[i] = j+1;
lengthVal[j+1] = i;
if (j >= sirSize)
sirSize = j+1;
}
for (i = 1, sirSize = 0; i <= n; ++i)
{
if (best[i] > sirSize)
{
sirSize = best[i];
j = i;
}
}
fprintf(fout, "%d\n", sirSize);
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;
}