Cod sursa(job #2222799)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 18 iulie 2018 01:22:09
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;
int N;
vector<int> V;
vector<int> ST;
vector<int> pre;
vector<int> pos;
vector<int> answer;

int main()
{
    ifstream fin ("scmax.in");
    ofstream fout ("scmax.out");
    fin.sync_with_stdio(false);
    fin.tie(0);

    int N;

    fin >> N;
    V.resize(N + 1);
    pre.resize(N + 1);
    pos.resize(N + 1);

    for (int i = 1; i <= N; ++i)
        fin >> V[i];
    for (int i = 1; i <= N; ++i)
    {
        int pz = lower_bound(ST.begin(), ST.end(), V[i]) - ST.begin();
        if(pz == ST.size())
            ST.emplace_back(V[i]);
        else
            ST[pz] = V[i];

        if (pz - 1 >= 0) pre[i] = pos[pz - 1];
        else pre[i] = 0;

        pos[pz] = i;
    }
    fout << ST.size() << "\n";
    int steps = ST.size();
    int k = pos[ST.size() - 1];

    while (steps--) {
        answer.emplace_back(V[k]);
        k = pre[k];
    }
    reverse(answer.begin(), answer.end());
    for (auto it : answer)
        fout << it << " ";

    return 0;
}