Cod sursa(job #2971880)

Utilizator andrei_C1Andrei Chertes andrei_C1 Data 28 ianuarie 2023 11:16:31
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.99 kb
// O(N logN)
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX = 1e5;
const int INF = 2e9 + 1;

int n;
int v[NMAX + 1];
int tr[NMAX + 1], ind[NMAX + 1];
int dp[NMAX + 1]; // dp[i] = elementul terminal al unui subsir crescator de lungime i
vector<int> ans;

int main() {
	fin >> n;

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

	for(int i = 1; i <= n; i++) {
		dp[i] = INF;
	}

	dp[0] = -INF;

	for(int i = 1; i <= n; i++) {
		int j = upper_bound(dp, dp + n + 1, v[i]) - dp; // cea mai mica pozitie pentru care dp[j] > v[i]
		if(dp[j - 1] < v[i]) {
			if(v[i] < dp[j]) {
				dp[j] = v[i];
				ind[j] = i;
				tr[i] = ind[j - 1];
			}
		}
	}

	int len = 1;
	for(int i = 2; i <= n && dp[i] < INF; i++) {
		len = i;
	}

	fout << len << '\n';

	int pos = ind[len];

	while(pos > 0) {
		ans.push_back(pos);
		pos = tr[pos];
	}

	reverse(ans.begin(), ans.end());

	for(int i = 0; i < (int) ans.size(); i++) {
		fout << v[ans[i]] << " ";
	}
	return 0;
}