Cod sursa(job #256866)

Utilizator stocarulCosmin-Mihai Tutunaru stocarul Data 12 februarie 2009 12:38:40
Problema Subsir crescator maximal Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.94 kb
#include<stdio.h>
#define infile "scmax.in"
#define outfile "scmax.out"
#define nmax (100*1000+1)
int v[nmax]; //vectorul cu sirul
int a[nmax]; //a[i]-pozitia elementului din v[], ce are o lungime a subsirului ce se termina in v[a[i]] egala cu i.
int b[nmax]; //pozitia elementului precedent in subsir crecator de lungime maxima
int l; //lungimea maxima gasita
int n; //lungimea sirului

void citire(int v[nmax], int *n)
	{
	int i;
	scanf("%d\n",n);
	for(i=1;i<=*n;i++)
		scanf("%d",&v[i]);
	}

//returnam lungimea maxima pe care o poate continua elementul de la pozitia i
int cbin(int i)
	{
	int m,p=1,q=l;
	int lm=0; //lungimea maxima ce o poate continua
	while(p<=q) //nu am terminat de cautat
		{
		m=(p+q)/2; //pozitia din mijloc
		if(v[a[m]]<v[i]) //elementul este mai mic
			{
			lm=m; //lungimea maxima:P
			p=m+1; //cautam in partea dreapta
			}
		else q=m-1; //este prea mare...restrictionam cautarea in partea stanga
		}
	return lm; //returnam lungimea maxima ce o poate continua elementul de la pozitia i
	}

//rezolvarea dinamica
void dinamica()
	{
	int i,j;
	a[l=1]=1; //ungimea maxima este 1, si ultimul element este defapt primul element din sir
	for(i=2;i<=n;i++) //trecem pe la fiecare element
		{
		j=cbin(i); //primim lungimea maxima ce o poate continua elementul de la pozitia i
		//salvam la lungime daca avem un element mai mic
		if(!a[j+1]) a[j+1]=i,l++;
		else if(v[a[j+1]]>v[i]) a[j+1]=i;
		
		b[i]=a[j]; //ii salvam tatal
		}
	}

//pozitia ce trebuie afisata
void afisare(int p)
	{
	if(b[p]) afisare(b[p]); //ii afisez intai tatal
	printf("%d ",v[p]); //il afisez pe el
	}

int main()
{
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);

citire(v,&n); //citim sirul
dinamica(); //facem dinamica

printf("%d\n",l); //afisem lungimea
afisare(a[l]); //afisem susirul incepand de la elementul de lungime maxima (pt k il afisem in psotordine)

fclose(stdin);
fclose(stdout);
return 0;
}