Pagini recente » Cod sursa (job #1932866) | Cod sursa (job #2867124) | Cod sursa (job #2620246) | Cod sursa (job #252813) | Cod sursa (job #2224733)
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
const string IN_FILE = "scmax.in";
const string OUT_FILE = "scmax.out";
const int INF = 0x3f3f3f3f;
vector<int> longestIncreasingSubsequence(const vector<int>& values) {
const int n = int(values.size());
auto dp = vector<int>({-INF});
auto index = vector<int>({-1});
auto parent = vector<int>(n, -1);
for (int i = 0; i < n; i++) {
const int length =
lower_bound(dp.begin(), dp.end(), values[i]) - dp.begin();
parent[i] = index[length - 1];
if (length == int(dp.size())) {
dp.push_back(values[i]);
index.push_back(i);
}
if (dp[length] > values[i]) {
dp[length] = values[i];
index[length] = i;
}
}
auto sequence = vector<int>();
for (int i = index.back(); i != -1; i = parent[i]) {
sequence.push_back(values[i]);
}
reverse(sequence.begin(), sequence.end());
return sequence;
}
vector<int> readValues() {
ifstream in(IN_FILE);
int n;
in >> n;
auto values = vector<int>(n);
for (int i = 0; i < n; i++) {
in >> values[i];
}
in.close();
return values;
}
void writeSequence(const vector<int>& sequence) {
ofstream out(OUT_FILE);
out << int(sequence.size()) << "\n";
for (int i = 0; i < int(sequence.size()); i++) {
out << sequence[i] << (i + 1 < int(sequence.size()) ? " " : "\n");
}
out.close();
}
int main() {
const auto values = readValues();
const auto sequence = longestIncreasingSubsequence(values);
writeSequence(sequence);
return 0;
}