Cod sursa(job #3288766)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 24 martie 2025 10:36:49
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <bits/stdc++.h>
#define aaa system("read -r -p \"Press enter to continue...\" key");
#define dbg(x) std::cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) std::cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)std::cerr<<x[_]<<' ';std::cerr<<'\n',aaa
#define dbgs(x) std::cerr<<(#x)<<"[stl]: ";for(auto _:x)std::cerr<<_<<' ';std::cerr<<'\n',aaa
#define dbgp(x) std::cerr<<(#x)<<": "<<x.first<<' '<<x.second<<'\n',aaa
#define dbgsp(x) std::cerr<<(#x)<<"[stl pair]:\n";for(auto _:x)std::cerr<<_.first<<' '<<_.second<<'\n';aaa

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

    int n; fin >> n;

    std::vector<int> v(n+1), d(n+1), prev(n+1); ///d[j] = z, unde v[z] este cel mai mic sfarsit al unei subsecv crescatoare maximale de lungime j.
    for (int i = 1; i <= n; i++) fin >> v[i];

    int last_ind = 0;
    for (int i = 1; i <= n; i++) {
        ///daca exista valori pentru d[0], d[1], .., d[k], atunci v[d[0]] < v[d[1]] < .. < v[d[k]].
        ///pp v[d[2]] = 5, v[d[3]] = 10. v[i] = 7. pot sa adaug doar dupa v[d[2]]. de fapt pot sa adaug doar dupa un element, aleg sa adaug dupa cel mai din dreapta.
        int j = 0;
        for (int pas = (1 << 17); pas; pas >>= 1) {
            if (j + pas < i && d[j+pas] != 0 && v[d[j+pas]] < v[i]) j += pas;
        }

        if (d[j+1] == 0 || v[d[j+1]] > v[i]) {
            d[j+1] = i;
            prev[i] = d[j];
            if (j+1 == n || d[j+2] == 0) last_ind = i;
        }
    }

    std::vector<int> sol;
    while (last_ind) {
        sol.push_back(v[last_ind]);
        last_ind = prev[last_ind];
    }

    std::reverse(sol.begin(), sol.end());
    fout << sol.size() << '\n';
    for (int x: sol) fout << x << ' ';
    fout << '\n';

    return 0;
}