Cod sursa(job #2458142)

Utilizator igsifvevc avb igsi Data 19 septembrie 2019 19:13:41
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.41 kb
#include <algorithm>
#include <fstream>
#include <iterator>
#include <vector>

std::vector<int> solve(std::vector<int> &V)
{
    std::vector<int> scmax, tails, DP;

    for (auto v : V)
    {
        auto it = std::lower_bound(tails.begin(), tails.end(), v);
        int scLen = std::distance(tails.begin(), it);

        if (tails.size() <= scLen)
        {
            tails.push_back(v);
        }
        else
        {
            tails[scLen] = std::min(tails[scLen], v);
        }

        DP.push_back(scLen + 1);
    }

    int scmaxLen = tails.size();
    for (size_t i = V.size(); i > 0 && scmaxLen > 0; i--)
    {
        if (DP[i - 1] == scmaxLen)
        {
            scmax.push_back(V[i - 1]);
            scmaxLen--;
        }
    }

    return std::vector<int>(scmax.rbegin(), scmax.rend());
}

std::vector<int> read();
void write(std::vector<int> &v);

int main()
{
    auto v = read();
    auto scmax = solve(v);
    write(scmax);

    return 0;
}

std::vector<int> read()
{
    std::ifstream fin("scmax.in");
    int n;
    std::vector<int> v;

    fin >> n;
    std::copy_n(std::istream_iterator<int>(fin), n, std::back_inserter(v));

    return v;
}

void write(std::vector<int> &v)
{
    std::ofstream fout("scmax.out");

    fout << v.size() << '\n';
    std::copy_n(v.begin(), v.size(), std::ostream_iterator<int>(fout, " "));
    fout << '\n';
}