Cod sursa(job #2878875)

Utilizator preda.andreiPreda Andrei preda.andrei Data 28 martie 2022 01:34:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <vector>

using namespace std;

int main() {
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");

    int n;
    fin >> n;

    vector<int> vec(n);
    vector<int> prev(n, -1);
    vector<int> dp;
    for (int i = 0; i < n; i += 1) {
        fin >> vec[i];

        auto bucket = -1;
        for (int pow = 1 << 30; pow > 0; pow >>= 1) {
            auto next = bucket + pow;
            if (next < (int)dp.size() && vec[dp[next]] < vec[i]) {
                bucket = next;
            }
        }
        bucket += 1;

        if (bucket >= 0 && bucket < (int)dp.size()) {
            if (bucket > 0) {
                prev[i] = dp[bucket - 1];
            }
            dp[bucket] = i;
        } else {
            if (!dp.empty()) {
                prev[i] = dp.back();
            }
            dp.push_back(i);
        }
    }

    vector<int> res(dp.size());
    int index = dp.back();
    for (int i = dp.size() - 1; i >= 0; i -= 1) {
        res[i] = vec[index];
        index = prev[index];
    }

    fout << dp.size() << "\n";
    for (const auto& num : res) {
        fout << num << " ";
    }
    fout << "\n";

    return 0;
}