Cod sursa(job #2372074)

Utilizator aurelionutAurel Popa aurelionut Data 6 martie 2019 21:16:34
Problema Subsir crescator maximal Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int NMAX = 100005;
int n, v[NMAX], dp[NMAX], mn[NMAX], m;
int a[NMAX];

int BS(int x)
{
	if (x > mn[m])
		return ++m;
	int left = 1, right = m, mid, pos;
	while (left <= right)
	{
		mid = (left + right) / 2;
		if (mn[mid] >= x)
		{
			pos = mid;
			right = mid - 1;
		}
		else
			left = mid + 1;
	}
	return pos;
}

int main() 
{
	ifstream fin("scmax.in");
	ofstream fout("scmax.out");
	fin >> n;
	for (int i = 1;i <= n;++i)
		fin >> v[i];
	int mx = 1;
	for (int i = 1;i <= n;++i)
	{
		int p = BS(v[i]);
		mn[p] = v[i];
		dp[i] = p;
		mx = max(mx, dp[i]);
	}
	fout << mx << "\n";
	int cnt = mx, val = (1 << 30);
	for (int i = n;i >= 1;--i)
		if (dp[i] == mx && v[i] < val)
			a[mx--] = v[i], val = v[i];
	for (int i = 1;i <= cnt;++i)
		fout << a[i] << " ";
	fin.close();
	fout.close();
	return 0;
}