Cod sursa(job #544209)

Utilizator zalmanDanci Emanuel Sebastian zalman Data 1 martie 2011 10:48:10
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <cstdio>
#define NMAX 100005
using namespace std;

int V[NMAX], N, Q[NMAX], P[NMAX], S[NMAX], lenP, lenQ;

void read(void)
{
	FILE *f = fopen("scmax.in", "r");
	fscanf(f, "%d", &N);
	for(int i = 1; i <= N; ++i)
		fscanf(f, "%d", &V[i]);
	fclose(f);
}

void insert(int x)
{
	for(int i = 1; i <= lenQ; ++i)
		if(x <= Q[i])
		{
			Q[i] = x;
			P[++lenP] = i;
			return;
		}
	Q[++lenQ] = x;
	P[++lenP] = lenQ;
}
void solve(void)
{
	P[1] = lenQ = lenP = 1, Q[1] = V[1];
	for(int i = 2; i <= N; ++i)
		insert(V[i]);
	//for(int i = 1; i <= lenQ; ++i)
	//	cout << Q[i] << ' ';
	
	for(int i = 1; i <= lenP; ++i)
		cout << P[i] << ' ';
	for(int i = lenQ, j = lenP; i; --i)
	{
		while(P[j] != i)
			--j;
		S[i] = j;
	}
}
void print(void)
{
	FILE *g = fopen("scmax.out", "w");
	fprintf(g, "%d\n", lenQ);
	for(int i = 1; i <= lenQ; ++i)
		fprintf(g, "%d ", V[ S[i] ]);
	
	fclose(g);
}
int main(void)
{
	read();
	solve();
	print();
	
	return 0;
}

/*int st = 1, dr = nr, m = (st+dr)/2, poz = nr + 1;
	while(st <= dr)
	{
		if(Q[m] > x)
		{
			poz = m;
			dr = m - 1;
		}
		else
			st = m + 1;
	}
	if(poz == nr+1)
		++nr;
	Q[poz] = x;
	P[++cnt] = poz;*/