Pagini recente » Cod sursa (job #1961248) | Cod sursa (job #1471606) | Cod sursa (job #1951958) | Cod sursa (job #1128348) | Cod sursa (job #1109534)
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
const int oo = 0x3f3f3f3f;
int N;
vector<int> Values, Answer;
vector<int> LongestIncreasingSubsequence(const vector<int> &values) {
vector<int> minValue, index, father;
minValue.push_back(-oo);
index.push_back(-1);
father = vector<int>(int(values.size()), -1);
int maxLength = 0, last = -1;
for (int i = 0; i < int(values.size()); ++i) {
int length = lower_bound(minValue.begin(), minValue.end(), values[i]) - minValue.begin();
if (length == int(index.size())) {
minValue.push_back(values[i]);
index.push_back(i);
} else if (minValue[length] > values[i]) {
minValue[length] = values[i];
index[length] = i;
}
father[i] = index[length - 1];
if (maxLength <= length) {
maxLength = length;
last = i;
}
}
vector<int> sequence;
for (int i = last; i != -1; i = father[i])
sequence.push_back(values[i]);
reverse(sequence.begin(), sequence.end());
return sequence;
}
void Solve() {
Answer = LongestIncreasingSubsequence(Values);
}
void Read() {
ifstream cin("scmax.in");
cin >> N;
Values = vector<int>(N);
for (int i = 0; i < N; ++i)
cin >> Values[i];
cin.close();
}
void Print() {
ofstream cout("scmax.out");
cout << int(Answer.size()) << "\n";
for (int i = 0; i < int(Answer.size()); ++i)
cout << Answer[i] << " ";
cout << "\n";
cout.close();
}
int main() {
Read();
Solve();
Print();
return 0;
}