Cod sursa(job #516216)

Utilizator ms-ninjacristescu liviu ms-ninja Data 23 decembrie 2010 13:32:22
Problema Secv Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#include <algorithm>
using namespace std;
#define dim 5001
int v[dim],a[dim],b[dim],best[dim];

int main()
{
	ifstream fin("secv.in");
	ofstream fout("secv.out");
	int i, n,m=1,j,maxim=1;
	fin>>n;

	if(n==0)
	{
			fout<<"1";
			return 0;
	}
		
	for(i=1;i<=n;++i)
	{
		fin>>v[i];
		a[i]=v[i];
	}
	sort(a+1,a+n+1);
	
	for(i=1;i<=n;++i)
	{
		while(a[i]==a[i+1])
			++i;
		b[m]=a[i];
		++m;
	}
	--m;
	for(i=1;i<=n;++i)
		best[i]=1;
	
	for(i=2;i<=n;++i)
	{

		for(j=i-1;j>=1;--j)
		{
			if(v[i]>v[j])
			{
				if(best[j]+1>best[i])
					best[i]=best[j]+1;
			}
			else
				if(v[i]==v[j])
					{
						if(best[j]>best[i])
						best[i]=best[j];
					}
			
		}
	
		if(maxim<best[i])
			maxim=best[i];
	}
	
	if(maxim!=m)
	{
		fout<<"1";
		return 0;
	}
	
	
		int contor,lung=dim,lulu,mare,aux;
		for(i=n;i>=1;--i)
		{
			
			while((v[i]==v[i-1] || best[i]!=maxim) && i>0)
				--i;
			aux=maxim;
			lulu=i;
			contor=0;
			int valid=0;
			while(aux>0 && i>0)
			{
				if(best[i]==aux)
					--aux;
			++contor;
			--i;
			valid=1;
			}
				
		
			if(contor<lung && valid==1)
			{
				mare=1;
				lung=contor;
				aux=maxim;
				for(j=lulu;j>=i+1;--j)
				{
					if(best[j]==aux)
					{
						a[mare]=v[j];
						++mare;
						--aux;
					}
				}
			}
			
		}
		--mare;
		sort(a+1,a+mare+1);
		
		int ok=1;
		
		for(j=1;j<=mare;++j)
			if(b[j]!=a[j])
			{
				ok=0;
				break;
			}
		
			if(ok==0)
				fout<<"1";
			else
			fout<<lung;
	
	
	
	return 0;
}