Cod sursa(job #811348)

Utilizator danutbodbodnariuc danut danutbod Data 11 noiembrie 2012 22:46:47
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb

#include <fstream>  //scmax 100p infoarena
using namespace std;
#define LMax 100010
int v[LMax],s[LMax],L[LMax],sol[LMax],n,i,j,k,poz,p,maxi;
ifstream f("scmax.in");
ofstream g("scmax.out");
int caut_bin(int x){
	int mij,st,dr;
	st=1;dr=k;
	while(st<=dr){
		mij=(st+dr)/2;
		if(s[mij-1]<x&&s[mij]>=x)return mij;
		else
		     if(s[mij]>x)dr=mij-1;
		     else st=mij+1;
	}
	return 0;
}

int main(){
	f>>n;
	for(i=1;i<=n;i++)f>>v[i];
	s[1]=v[1];
	L[1]=1;
	k=1;
	for(i=2;i<=n;i++){
		poz=caut_bin(v[i]);
		if(poz==0){ s[++k]=v[i];L[i]=k;}
		else {s[poz]=v[i];L[i]=poz;}
	}
	for(i=1;i<=n;i++)
		if(L[i]>maxi){ maxi=L[i];p=i; }
	k=0;
	g<<maxi<<'\n';
	while(maxi){
		if(L[p]==maxi) { sol[++k]=v[p]; maxi--;}
		p--;
	}
	for(i=k;i>0;i--)	g<<sol[i]<<" ";
	g<<'\n';
	f.close();g.close();
	return 0;
}
/*
#include <fstream> //70p
using namespace std;
#define LMax 100010
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[LMax],L[LMax],poz[LMax],sol[LMax],j,maxi,maxL,Pmax,t,n,i;
int main()
{
	f >> n;
	for(i=1;i<=n;i++)f >> a[i];
	L[1]=1;
	for(i=2;i<=n;i++)
	{
		maxi=0;
		for(j=i-1;j>=1;j--)
			if(a[j]<a[i] && maxi<L[j])
			{
				maxi=L[j];
				poz[i]=j;
			}
		L[i]=maxi+1;
	}

	maxL=0;
	for(i=1;i<=n;i++)
		if(maxL<L[i])
		{
			maxL=L[i];
			Pmax=i;
		}
	t=1;j=Pmax;
	while (j!=0)
	{
		sol[t++]=a[j];
		j=poz[j];
	}
	g << maxL << '\n';
	for(i=t-1;i>=1;i--)	g << sol[i] << ' ';
	g << '\n';
	f.close();	g.close();
    return 0;
}
*/