Cod sursa(job #676671)

Utilizator JBaccountCatalin JBaccount Data 9 februarie 2012 15:06:15
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>

using namespace std;

#define NM 100005
#define inf 2000000000

int N, A[NM], B[NM], W[NM], WB[NM], BA[NM];

void solve1()
{
	scanf ("%d", &N);
	
	for (int i = 1; i <= N; ++i) scanf ("%d", &A[i]);
	
	for (int i = 1; i <= N; ++i) 
		for (int j = 0; j < i; ++j)
			if (A[i] > A[j] && B[j] + 1 > B[i])
			{
				B[i] = B[j] + 1;
				W[i] = j;
			}	
	
	int best = 0, p;		
	for (int i = 1; i <= N; ++i) 
		if (B[i] > best)		
		{
			best = B[i];
			p = i;
		}	
		
	printf ("%d\n", best);
	B[0] = 0;
	while (p)
	{
		B[++B[0]] = A[p];
		p = W[p];
	}	
		
	for (int i = B[0]; i > 0; --i) printf ("%d ", B[i]);	
	printf ("\n");
}

void solve2()
{	
	scanf ("%d", &N);
	
	for (int i = 1; i <= N; ++i) scanf ("%d", &A[i]);
	
	for (int i = 1; i <= N; ++i) B[i] = inf;
	
	for (int i = 1; i <= N; ++i)
	{
		int st = 0; 
		int dr = N;
		
		while (st < dr - 1)
		{
			int mij = (st + dr)/2;
			if (A[i] > B[mij]) st = mij;
			else dr = mij;
		}	
		int ind;
		if (A[i] > B[dr]) ind = dr;
		else ind = st;
		
		//printf ("ZZZ %d %d %d\n", ind, B[ind], WB[ind]);
		
		BA[i] = ind + 1;
		W[i] = WB[ind];
		if (B[ind + 1] > A[i])
		{
			B[ind + 1] = A[i];
			WB[ind + 1] = i;
		}	
	}	
	
	int best = 0, p;		
	for (int i = 1; i <= N; ++i) 
		if (BA[i] > best)		
		{
			best = BA[i];
			p = i;
		}	
		
	printf ("%d\n", best);
	B[0] = 0;
	while (p)
	{
		B[++B[0]] = A[p];
		p = W[p];
	}	
		
	for (int i = B[0]; i > 0; --i) printf ("%d ", B[i]);
}

int main()
{
	freopen ("scmax.in", "r", stdin);
	freopen ("scmax.out", "w", stdout);
	
	//solve1();
	solve2();
	
	return 0;
}