Cod sursa(job #1175984)

Utilizator vlasinalinVlasin Alin vlasinalin Data 25 aprilie 2014 12:16:12
Problema Subsir crescator maximal Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <stdio.h>
#include <iostream>
#include <fstream>
using namespace std;

#define in "scmax.in"
#define out "scmax.out"
#define MAXN 100001

int n, arr[MAXN], parent[MAXN], min_tail[MAXN], max_inc_len, sol[MAXN], maxi;

void read_input()
{
	ifstream fin(in);
	if (fin.is_open())
	{
		fin >> n;
		for (int i = 1; i <= n; ++i)
		{
			fin >> arr[i];
			//cout << arr[i] << ' ';
		}
		fin.close();
	}
}

int binary_search(int left, int right, int val)
{
	if (left == right)
		return left;

	int center = (left + right) / 2;
	if (val <= min_tail[center])
	{
		binary_search(left, center, val);
	}
	else
	{
		binary_search(center + 1, right, val);
	}
}

void resolve()
{
	int pi;
	for (int i = 1; i <= n; ++i)
	{
		if (arr[i] > min_tail[max_inc_len])
		{
			max_inc_len++;
			min_tail[max_inc_len] = arr[i];
			sol[max_inc_len] = arr[i];
			parent[max_inc_len] = min_tail[max_inc_len - 1];
		}
		else
		{
			pi = binary_search(1, max_inc_len, arr[i]);
			min_tail[pi] = arr[i];
		}
	}
}

void print_debug()
{
	cout << '\n';

}

void print_solution()
{
	ofstream fout(out);
	fout << max_inc_len << '\n';

	int k;
	sol[max_inc_len] = min_tail[max_inc_len];
	for (k = max_inc_len; k > 0; k--)
	{
		sol[k - 1] = parent[k];
	}

	for (int i = 1; i <= max_inc_len; ++i)
	{
		fout << sol[i] << ' ';
	}
}

int main()
{
	read_input();

	resolve();

	//print_debug();

	print_solution();

	//char x;
	//cin >> x;

	return 0;
}