Pagini recente » Cod sursa (job #202135) | Cod sursa (job #177461) | Cod sursa (job #266084) | Cod sursa (job #404216) | Cod sursa (job #2003229)
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
constexpr int INF = 123456789;
bool rev(int a, int b) {
return a > b;
}
int main() {
int n;
fin >> n;
vector<pair<int, int>> srtd(n);
vector<pair<int, int>> seq(n);
for (int i = 0; i < n; i += 1) {
int x;
fin >> x;
srtd[i] = make_pair(x, i);
}
sort(srtd.begin(), srtd.end());
for (int i = 0; i < n; i += 1) {
pair<int, int> pr = srtd[i];
seq[pr.second] = make_pair(pr.first, i);
}
vector<int> best(n+1, INF);
vector<vector<int>> solutions(n+1, vector<int>(0));
int ans = 0;
best[0] = -1;
for (int i = 0; i < n; i++) {
pair<int, int> x = seq[i];
int val = x.first;
int srtdPos = x.second;
int len = (upper_bound(best.begin(), best.end(), srtdPos)-best.begin());
if (srtd[best[len-1]].first != val) {
if (best[len] == INF) {
ans = len;
}
best[len] = min(srtdPos, best[len]);
solutions[len].push_back(srtdPos);
}
}
fout << ans << '\n';
// constructing the solution
vector<int> sequence(ans);
int pos = solutions[ans].back();
for (int i = ans; i > 0; i -= 1) {
int x = lower_bound(solutions[i].begin(), solutions[i].end(), pos, rev) - solutions[i].begin();
while (srtd[solutions[i][x]].first == sequence[i]) {
x += 1;
}
pos = solutions[i][x];
sequence[i-1] = srtd[pos].first;
}
for (auto x : sequence) {
fout << x << " ";
}
fout << endl;
return 0;
}