Pagini recente » Cod sursa (job #2386456) | Cod sursa (job #2733135) | Cod sursa (job #649691) | Cod sursa (job #84541) | Cod sursa (job #922429)
Cod sursa(job #922429)
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef vector<pair<int, int> >::iterator piter;
bool comp(const pair<int, int>& a, const pair<int, int>& b)
{
return a.first <= b.first;
}
void lis(vector<int>& v)
{
vector<int> parent(v.size(), -1);
vector<pair<int, int> > best;
for (size_t i = 0; i < v.size(); ++i) {
pair<int, int> item = make_pair(v[i], 0);
piter it = lower_bound(best.begin(), best.end(), item, comp);
item.second = i;
if (it == best.end()) {
parent[i] = (best.size() == 0) ? -1 : best.back().second;
best.push_back(item);
} else {
parent[i] = parent[it->second];
*it = item;
}
}
printf("%lu\n", best.size());
vector<int> sol;
for (int i = best.back().second; i != -1; i = parent[i])
sol.push_back(v[i]);
vector<int>::reverse_iterator rit;
for (rit = sol.rbegin(); rit != sol.rend(); ++rit)
printf("%d ", *rit);
printf("\n");
}
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
int N;
scanf("%d", &N);
vector<int> v;
for (int i = 0; i < N; ++i) {
int x;
scanf("%d", &x);
v.push_back(x);
}
lis(v);
return 0;
}