Cod sursa(job #2158131)

Utilizator shantih1Alex S Hill shantih1 Data 10 martie 2018 10:51:32
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
// facem varianta de 70 de pt cu programare dinamica.
// am revenit si am o varianta de 100 cu cautare binara.
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int lg,n,i,j,h,v[100005],s,pr[100005];
struct el
{	int x,e;	} q;
vector<el> tail;
vector<int> rz;

int cbin(int k)
{
	int st=1,dr=lg-1,m=0;
	while(st<=dr)
	{
		m=st+(dr-st)/2;
		if(tail[m].x>=k)	dr=m-1;
		else	st=m+1;
	}
	if(tail[m].x<k)	m++;
	if(tail[m-1].x>=k)	m--;
	return m;
}
int main () {

	fin>>n;
	for(i=1;i<=n;i++)
		fin>>v[i];
	
	q.x=v[1];	q.e=1;
	tail.push_back(q);
	lg=0;
	for(i=2;i<=n;i++)
	{
		if(v[i]<tail[0].x)
		{
			tail[0].x=v[i];
			tail[0].e=i;
			s=0;
		}
		else if(v[i]>tail[lg].x)	
		{
			q.x=v[i];	q.e=i;
			pr[i]=tail[lg].e;
			tail.push_back(q);
			lg++;
		}
		else
		{
			h=cbin(v[i]);
			if(v[i]<tail[h].x)
			{
				pr[i]=tail[h-1].e;
				tail[h].x=v[i];
				tail[h].e=i;
			}
		}
	}
	
	fout<<lg+1<<"\n";
	h=tail[lg].e;
	j=lg+1;
	while(j)
	{
		j--;
		rz.push_back(v[h]);
		h=pr[h];
	}
	for(j=(int)rz.size()-1;j>=0;j--)
		fout<<rz[j]<<" ";
}