Cod sursa(job #2770317)

Utilizator bubblegumixUdrea Robert bubblegumix Data 20 august 2021 14:52:26
Problema Subsir crescator maximal Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include<fstream>
#include <set>
#include<vector>
#include<algorithm>
#include <unordered_map>
#define NMAX 100010
#define lsb(x) (x&(-x))
using namespace std;
int a[NMAX];
int a2[NMAX];
int a3[NMAX];
int dp[NMAX];
int aib[NMAX];
int n;

ifstream f("scmax.in");
ofstream g("scmax.out");
void compressCoord()
{
	set<int> s;
	for (int i = 1; i <= n; i++)
		s.insert(a[i]);
	unordered_map<int, int> hmap;
	int idx = 0;
	for (auto it : s)
	{
		idx++;
		hmap[it]=idx;
	}
	for (int i = 1; i <= n; i++)
		a2[i] = hmap[a[i]];
}
int query(int index)
{
	int ans = 0;
	for (int i = index; i > 0; i -= lsb(i))
		ans = max(aib[i], ans);
	
	return ans;
}
int update(int index)
{
	int x;
	if (dp[index - 1])
		x = dp[index - 1];
	else
		x = query(index - 1);
	for (int i = index; i <= n; i += lsb(i))
		aib[i] = max(aib[i], x + 1);
	return dp[index]=x+1;
}

int main()
{
	ios_base::sync_with_stdio(false);
	f.tie(0);
	g.tie(0);
	f >> n;
	for (int i = 1; i <= n; i++)
		f >> a[i];
	compressCoord();
	for (int i = 1; i <= n; i++)
	{
		a3[i]=update(a2[i]);
		
	}

	int hmax = query(n);
	vector<int> sol;
	for(int i=n;i>=1;i--)
		if (a3[i] == hmax)
		{
			hmax--;
			sol.push_back(i);
		}
	reverse(begin(sol), end(sol));
	g << sol.size() << '\n';
	for (auto it : sol)
		g << a[it] << " ";
}