Cod sursa(job #872454)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 6 februarie 2013 02:40:58
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.91 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;

vector<int>s[100000];

int main()
{
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out", "w", stdout);
	int n, i, j, *v, *next, *cnt, k=0, start;
	scanf("%d", &n);
	v=(int*)malloc(4*n); next=(int*)malloc(4*n); cnt=(int*)malloc(4*n);
	for (i=0; i<n; ++i) cnt[i] = 1;
	for (i=0; i<n; ++i)
		scanf("%d", v+i);
	
	for (i=n-2; i>=0; --i)
		for (j=i+1; j<n; ++j)
			if (v[j] > v[i])
				s[i].push_back(j);
	
	for (i=n-1; i>=0; --i)
	{
		int size=s[i].size(), maxim=0, poz=i;
		for (j=0; j<size; ++j)
			if (maxim < cnt[s[i][j]])
			{
				maxim = cnt[s[i][j]];
				poz = s[i][j];
			}
		s[i].clear();
		cnt[i] += maxim;
		if (cnt[i] > k)
		{
			k = cnt[i];
			start = i;
		}
		next[i] = poz;
	}
	
	printf("%d\n", k);
	for (i=0; i<k; ++i)
	{
		printf("%d ", v[start]);
		start = next[start];
	}
	
	return 0;
}