Pagini recente » Cod sursa (job #2416673) | Cod sursa (job #770980) | Cod sursa (job #1103356) | Cod sursa (job #1514193) | Cod sursa (job #1249249)
/**
* Find the longest increasing subsequence = lis
* last[i] = the position where it ends the lis of exactly i elements
*/
#include <stdio.h>
#define MAXN 100001
int v[MAXN], last[MAXN], prev[MAXN], n, lis_length;
void find_lis()
{
int i, left, right, middle;
last[1] = 1;
lis_length = 1;
for (i = 2; i <= n; i++) {
left = 1, right = lis_length;
while (left <= right) {
middle = (left + right) / 2;
if (v[i] > v[ last[middle] ]) {
left = middle + 1;
} else {
right = middle - 1;
}
}
if (left == lis_length + 1) lis_length = lis_length + 1;
last[left] = i;
prev[i] = last[left - 1];
}
}
void build_sol(int pos, FILE *fdout)
{
if (prev[pos])
build_sol(prev[pos], fdout);
fprintf(fdout, "%d ", v[pos]);
}
int main()
{
FILE *fdin = fopen("scmax.in", "r");
FILE *fdout = fopen("scmax.out", "w");
int i;
fscanf(fdin, "%d", &n);
for (i = 1; i <= n; i++) fscanf(fdin, "%d", &v[i]);
find_lis();
fprintf(fdout, "%d\n", lis_length);
build_sol(last[lis_length], fdout);
fclose(fdin);
fclose(fdout);
return 0;
}