Cod sursa(job #173586)

Utilizator andrei.12Andrei Parvu andrei.12 Data 7 aprilie 2008 20:58:57
Problema Euro Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>
#include<algorithm>

using namespace std;

#define lg 10005

int n, i, mx, nr;
short sol[2][lg];
double v[lg], q[lg];

int find(double val){
	int li = 1, ls = nr+1, gs = 0, x;
	q[nr+1] = 100;

	while (li <= ls){
		x = (li+ls) / 2;

		if (q[x] >= val){
			gs = x;
			ls = x-1;
		}
		else
			li = x+1;
	}

	q[gs] = val;
	if (gs == nr+1)
		nr ++;
	return gs;
}
void subsir(double v[lg], short sol[]){
	sol[1] = 1;
	q[1] = v[1];
	nr = 1;

	for (int i = 2; i <= n; i ++)
		sol[i] = find(v[i]);
}
int main()
{
	freopen("euro2.in", "rt", stdin);
	freopen("euro2.out", "wt", stdout);

	scanf("%d", &n);
	for (i = 1; i <= n; i ++)
		scanf("%lf", &v[i]);

	subsir(v, sol[0]);

	int x1 = 1, x2 = n;
	while (x1 < x2){
		swap(v[x1], v[x2]);
		x1 ++, x2 --;
	}
	
	subsir(v, sol[1]);
	/*
	for (i = 1; i <= n; i ++)
		printf("%d %d\n", sol[0][i], sol[1][n-i+1]);
	*/
		
	for (i = 1; i <= n; i ++)
		if (sol[0][i] + sol[1][n-i+1] - 1 > mx && sol[0][i] > 1 && sol[1][n-i+1] > 1)
			mx = sol[0][i] + sol[1][n-i+1] - 1;

	printf("%d\n", mx);

	return 0;
}