Cod sursa(job #2227580)

Utilizator TrixerAdrian Dinu Trixer Data 1 august 2018 05:46:31
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <stdio.h>

#define MAXN 100005

int sequence[MAXN], index_length[MAXN + 1], pre[MAXN], subseq[MAXN];

int main(void)
{
	// read input
	int n, lo, hi, mid, idx;

	freopen("scmax.in", "r", stdin);
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d", &sequence[i]);

	// solve
	int length = 0;
	for (int i = 0; i < n; i++) {
		// search for length of subsequence that ends in sequence[i]
		lo = 1;
		hi = length;
		
		while (lo <= hi) {
			mid = (lo + hi) / 2;
			if (sequence[index_length[mid]] < sequence[i])
				lo = mid + 1;
			else
				hi = mid - 1;
		}

		// update
		pre[i] = index_length[lo - 1];
		index_length[lo] = i;
		
		if (lo > length)
			length = lo;
	}

	// write output
	freopen("scmax.out", "w", stdout);
	printf("%d\n", length);
	idx = index_length[length];
	for (int i = length - 1; i >= 0; i--) {
		subseq[i] = sequence[idx];
		idx = pre[idx];
	}
	for (int i = 0; i < length; i++)
		printf("%d ", subseq[i]);

	return 0;
}