Cod sursa(job #2771153)

Utilizator davidcotigacotiga david davidcotiga Data 25 august 2021 17:59:14
Problema Subsir crescator maximal Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <algorithm>
#include <string>
#include <queue>
#include <vector>
#include <cmath>

//using namespace std;

std::ifstream fin("scmax.in");
std::ofstream fout("scmax.out");

int n;
int v[100005];
int nrMultimi;
int topMultimi[100005];
std::vector<std::pair<int, int>> multimi[100005];
std::pair<int, int> index[100005];

int rez[100005];

int main()
{

	fin >> n;

	bool ok = true;

	for (int i = 1; i <= n; ++i)
	{
		fin >> v[i];

		ok = false;
		for (int j = 1; j <= nrMultimi; ++j)
		{
			if (v[i] <= topMultimi[j])
			{
				topMultimi[j] = v[i];
				if (j >= 2)
					index[i] = { j - 1, multimi[j - 1].size() - 1 };
				multimi[j].push_back({ v[i], i });
				ok = true;
				break;
			}
		}

		if (ok == false)
		{
			if (nrMultimi >= 1)
				index[i] = { nrMultimi, multimi[nrMultimi].size() - 1 };
			topMultimi[++nrMultimi] = v[i];
			multimi[nrMultimi].push_back({ v[i], i });
		}
	}

	/*for (int i = 1; i <= nrMultimi; ++i)
		fout << topMultimi[i] << " ";

	fout << "\n";

	for (int i = 1; i <= nrMultimi; ++i)
	{
		for (int j = 0; j < multimi[i].size(); ++j)
			fout << multimi[i][j] << " ";
		fout << "\n";
	}*/

	//for (int i = 1; i <= 5; ++i)
		//fout << index[i].first << " " << index[i].second << "\n";

	fout << nrMultimi << "\n";

	int current = n;
	int ind = 0;
	while (index[current].first != 0)
	{
		//fout << v[current] << " ";
		rez[ind++] = v[current];
		current = multimi[index[current].first][index[current].second].second;
	}
	rez[ind++] = v[current];
	//fout << v[current];

	for (int i = ind - 1; i >= 0; --i)
		fout << rez[i] << " ";

	return 0;
}