Pagini recente » Borderou de evaluare (job #3034385) | Borderou de evaluare (job #982933) | Monitorul de evaluare | Borderou de evaluare (job #3318778) | Cod sursa (job #809238)
Cod sursa(job #809238)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
inline int next_int() {
int d;
scanf("%d", &d);
return d;
}
vector<int> LIS(const vector<int> & X) {
int n = X.size();
vector<int> P(n + 1, -1);
vector<int> M(n + 1, -1);
M[1] = 0;
int L = 1;
for (int i = 1; i < n; i++) {
int lo = 0, hi = L + 1;
while (hi - lo > 1) {
int mid = (lo + hi) / 2;
if (X[M[mid]] < X[i]) {
lo = mid;
} else {
hi = mid;
}
}
int j = lo;
P[i] = M[j];
if (j == L || X[i] < X[M[j + 1]]) {
M[j + 1] = i;
L = max(L, j + 1);
}
}
vector<int> ans;
int x = M[L];
while (x != -1) {
ans.push_back(X[x]);
x = P[x];
}
reverse(ans.begin(), ans.end());
return ans;
}
int main() {
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int n = next_int();
vector<int> A;
for (int i = 0; i < n; i++) {
A.push_back(next_int());
}
vector<int> ans = LIS(A);
printf("%d\n", int(ans.size()));
for (size_t i = 0; i < ans.size(); i++) {
printf("%d ", ans[i]);
}
}