Cod sursa(job #1360858)

Utilizator alexandru94hahahalera alexandru94 Data 25 februarie 2015 18:25:25
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>

using namespace std;

int N, L, a[100001], pre[100001], last[100001];

ifstream f("scmax.in");
ofstream g("scmax.out");


void show(int ind)
{
	if(pre[ind]) 
		show(pre[ind]);
	g<<a[ind]<<' ';
	
}

int main()
{
	int i;	
	f >> N;
	for(i = 1; i <= N; i++)
	{
		f >> a[i];
	}

	L = 1;
	last[1] = 1; // last[i] reprezinta ultimul index in care se termina
	// un subsir crescator maximal de lungime exact i
	// parcurg sirul	
	for(i = 2; i <= N; i++)
	{
	// la fiecare pas, caut binar o pozitie in care elementul respectiv
	// este mai mic decat elementul curent a[i]
		int low = 1, high = L;
		// L - este lungimea lui last
		while(low <= high)
		{
			// aflam jumatatea 
			int mean = (low + high) / 2;
			// daca elementul curent a[i] este mai mare decat jumatatea 
			// intervalului de indecsi in care caut 
			if(a[last[mean]] < a[i]) {
				// ma duc sa caut in jumatatea dreapta
				low = mean + 1;
			} else {
				// altfel in jumatatea stanga
				high = mean - 1;
			}
		}
		// daca elementul curent este mai mare decat toate elementele
		// asociate indecsilor din array atunci inseamna ca trebuie
		// sa cresc lungime solutiei curente
		if(low == L + 1) {
			++L;
		}
		// notez faptul ca ultimul sir de lungime low se termina pe 
		// pozitia i
		last[low] = i;
		// si leg acest element de subisrul crescator maximal ce se termina pe 
		// pozitia low -1
		pre[i] = last[low - 1];
	}	
	
	g<<L<<'\n';
	show(last[L]);
	return 0;
}