Pagini recente » Cod sursa (job #1893526) | Cod sursa (job #29171) | Cod sursa (job #2945962) | Cod sursa (job #1583105) | Cod sursa (job #1809089)
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
template<class T>
class LIS {
public:
LIS(const vector<T>& array) : array_(array) {}
vector<T> FindLIS() {
vector<T> v;
vector<int> where(array_.size());
int answer = 0;
for (int i = 0; i < array_.size(); i++) {
v.push_back(numeric_limits<T>::max());
int position = lower_bound(v.begin(), v.end(), array_[i]) - v.begin();
v[position] = array_[i];
where[i] = position;
answer = max(answer, position);
}
int current = answer;
vector<int> actual_answer;
for (int i = (int)array_.size() - 1; i >= 0; i--) {
if (where[i] == current) {
actual_answer.push_back(array_[i]);
current--;
}
}
reverse(actual_answer.begin(), actual_answer.end());
return actual_answer;
}
private:
vector<T> array_;
};
int main() {
cin.sync_with_stdio(false);
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
LIS<int> lis(a);
vector<int> answer = lis.FindLIS();
cout << answer.size() << '\n';
for (auto it : answer) {
cout << it << " ";
}
return 0;
}