Cod sursa(job #922429)

Utilizator sebii_cSebastian Claici sebii_c Data 22 martie 2013 10:19:47
Problema Subsir crescator maximal Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#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;
}