Pagini recente » Cod sursa (job #2972124) | Cod sursa (job #2222406) | Cod sursa (job #1043114) | Cod sursa (job #2355224) | Cod sursa (job #897845)
Cod sursa(job #897845)
#include <algorithm>
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
typedef unsigned int uint32;
void find_lis(vector<int> &v, vector<int> &lis);
int main() {
int N;
vector<int> v, lis;
fin >> N;
for (int i = 0, x; i < N; ++i) {
fin >> x;
v.push_back(x);
}
find_lis(v, lis);
fout << lis.size() << '\n';
for (uint32 i = 0; i < lis.size(); ++i) {
fout << v[lis[i]] << ' ';
}
return 0;
}
void find_lis(vector<int> &v, vector<int> &lis) {
vector<int> p(v.size());
lis.push_back(0);
for (uint32 i = 1; i < v.size(); ++i) {
if (v[i] > v[lis.back()]) {
p[i] = lis.back();
lis.push_back(i);
continue;
}
uint32 lo = 0, hi = lis.size() - 1;
while (lo < hi) {
int mid = lo + (hi - lo) / 2;
if (v[i] > v[lis[mid]]) lo = mid + 1;
else hi = mid;
}
if (v[i] < v[lis[lo]]) {
if (lo > 0) p[i] = lis[lo - 1];
lis[lo] = i;
}
}
for (uint32 i = lis.size(), j = lis.back(); i--; j = p[j]) lis[i] = j;
}