Cod sursa(job #1534496)

Utilizator kassay_akosKassay Akos kassay_akos Data 23 noiembrie 2015 19:23:06
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
//************************************************************************
//		PSIHOLOGIA CONCURSURILOR DE INFORMATICA - PROBLEMA 13
//		v	2		5		7		3		4		1
//		q	2		2,5		2,5,7	2,3		2,3,4	1		- BEST TIL NOW
//		p	1		2		3		2		3		1		- AL CATELEA ESTE IN LISTA Q
//	SE INSEREAZA NOUL ELEMENT PE Q[m] > v[i] => Q[M] = V[I]; P[I] = M; 
//	!! CAUTATRE IN Q CU CAUTARE BINARA !!
//************************************************************************


#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;
const int nmax = 100002;
const int INF = 1 << 30;

int n, len = 0,v[nmax], q[nmax], p[nmax], res[nmax];

int generare();

int main()
{
	freopen("scmax.in", "r", stdin);
	freopen("scmax.out","w",stdout);
	scanf("%d ", &n);
	for (int i = 0; i < n; i++)   scanf("%d ", &v[i]);
	memset(q, 0, 4 * (n + 2));
	memset(p, 0, 4 * (n + 2));
		
	int l = generare();
	printf("%d \n", l+1);
	for (int i = 0; i <= l; i++)
		printf("%d ", q[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}

int cautareBinara(int el, int ve, int k) {
	if (el == ve) {
		if (ve == len) q[++len] = INF;
		q[ve] = k;
		return el;
	}
	int mid = (el + ve) / 2;
	if (q[mid] < k)		return cautareBinara(mid + 1, ve, k);
	else                return cautareBinara(el, mid , k);
}

int generare()
{
	int j, max = -1,maxInd = 0;
	q[0] = INF;
	for (int i = 0; i < n; i++) {
		p[i] = cautareBinara(0,len,v[i]);
		if (p[i] > max) { max = p[i]; maxInd = i; };
	}
	int k = max;
	for (int i = maxInd; i >= 0; i--){
		if (p[i] == k) {
			q[k] = v[i];
			k--;
		}
	}
	return max;
}