Cod sursa(job #623883)

Utilizator otilia_sOtilia Stretcu otilia_s Data 20 octombrie 2011 21:26:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <cstring>
#define NMAX 100006
using namespace std;

int a[NMAX]; //vectorul dat
int elem_lg[NMAX]; //elem_lg[x]=i -> elementul i din vect a este cel mai mic element cu care se poate incheia un subsir crescator de lungime x
int p[NMAX]; //predecesor
int n,lmax;

void citire()
{
	int i;
	ifstream fin("scmax.in");
	fin>>n;
	for (i=1;i<=n;++i)
		fin>>a[i];
	fin.close();
}

int cautare_bin(int key)
{
	int ls=1, ld=lmax, mij;  
	int poz=0;
	while (ls<=ld)
	{
		mij=(ls+ld)/2;
		if (a[elem_lg[mij]]<key)
			{
				poz=mij; 
				ls=mij+1;
			}
		else
			{
				ld=mij-1;
			}
	}
	return poz;
}

void rez()
{
	int i,lg;
	
	memset(elem_lg,0,sizeof(elem_lg));
	elem_lg[1]=1; p[1]=0; lmax=1;
	
	for (i=2;i<=n;++i)
	{
		lg=cautare_bin(a[i]); //caut binar lungimea celui mai mare subsir cresc pe care a[i] il poate continua
		
		p[i]=elem_lg[lg];
		if (lg==lmax)	
			elem_lg[++lmax]=i;
		else
			if (a[i]<a[elem_lg[lg+1]]) elem_lg[lg+1]=i;
	}
}

void afisare()
{
	ofstream fout("scmax.out");
	fout<<lmax<<endl;
	
	int subs[NMAX],nre=0,i,x;
	x=elem_lg[lmax];
	while (x)
	{
		subs[++nre]=x;
		x=p[x];
	}
	
	for (i=nre; i; --i)
		fout<<a[subs[i]]<<" ";
	fout.close();
}

int main()
{
	citire();
	rez();
	afisare();
	
	return 0;
}