Cod sursa(job #2153182)

Utilizator trifangrobertRobert Trifan trifangrobert Data 6 martie 2018 00:28:01
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <algorithm>
#include <vector>

using namespace std;

const int DIM = 100010;
int aib[DIM];
int n, v[DIM], dp[DIM];
pair <int, int> a[DIM];
pair <int, int> b[DIM];
int frecv[DIM];
int elmax = -1;
int Max = -1;
vector <int> sol;

void Read()
{
	ifstream fin("scmax.in");
	fin >> n;
	for (int i = 1;i <= n;++i)
		fin >> v[i];
	fin.close();
}

void Normalizare()
{
	for (int i = 1;i <= n;++i)
		a[i] = make_pair(v[i], i);
	sort(a + 1, a + n + 1);
	int val = 0;
	for (int i = 1;i <= n;++i)
	{
		if (a[i].first != a[i - 1].first)
			b[i] = make_pair(a[i].second, ++val);
		else
			b[i] = make_pair(a[i].second, val);
	}
	elmax = val;
	sort(b + 1, b + n + 1);
}

inline int lsb(int i)
{
	return i & (-i);
}

void Update(int pos, int val)
{
	for (int i = pos;i <= elmax;i += lsb(i))
		aib[i] = max(aib[i], val);
}

int Query(int val)
{
	int ret = -1;
	for (int i = val;i >= 1;i -= lsb(i))
		ret = max(ret, aib[i]);
	return ret;
}

void Solve()
{
	for (int i = 1;i <= n;++i)
	{
		dp[i] = 1 + Query(b[i].second - 1);
		Update(b[i].second, dp[i]);
	}

	int x = -1;
	for (int i = 1;i <= n;++i)
		x = max(x, dp[i]);
	for (int i = n;i >= 1;--i)
	{
		if (x == dp[i])
		{
			sol.push_back(v[i]);
			--x;
		}
	}
	reverse(sol.begin(), sol.end());
}

void Write()
{
	ofstream fout("scmax.out");
	fout << (int)sol.size() << "\n";
	for (auto i : sol)
		fout << i << " ";
	fout.close();
}

int main()
{
	Read();
	Normalizare();
	Solve();
	Write();
	return 0;
}