Cod sursa(job #2930650)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 29 octombrie 2022 10:36:15
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> normalizare_sort(vector<int> &a);

int query(int nr, const vector<int> &aib);
void update(int nr, int lun, vector<int> &aib);

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

    int n;
    fin >> n;
    vector<int> a(n);
    for (auto &r : a)
        fin >> r;

    vector<int> norm = normalizare_sort(a);
    vector<int> aib(n+1);

    int sol = 0;
    int isol = -1;
    vector<int> lung(n);

    for (int i = 0; i < n; ++i) {
        int nr = norm[i];
        int lun = query(nr-1, aib);

        int curr = lun + 1;
        if (curr > sol) {
            sol = curr;
            isol = i;
        }
        lung[i] = curr;

        update(nr, curr, aib);
    }

    fout << sol << "\n";

    vector<int> elem(sol);

    while (sol > 0) {
        elem[sol-1] = norm[isol];
        sol--;
        for (int j = isol-1; j >= 0; j--)
            if (norm[j] < norm[isol] && lung[j] == sol) {
                isol = j;
                break;
            }
    }

    for (auto i : elem)
        fout << a[i-1] << ' ';
    fout << "\n";

    return 0;
}


vector<int> normalizare_sort(vector<int> &a)
{
    vector<int> rezultat = a;
    vector<int> b = a;
    sort(b.begin(), b.end());

    for (auto &r : rezultat) {
        auto it = lower_bound(b.begin(), b.end(), r);
        r = 1 + (it - b.begin());
    }

    a.swap(b);
    return rezultat;
}

int query(int nr, const vector<int> &aib)
{
    int rez = 0;

    while (nr) {
        rez = max(rez, aib[nr]);
        //nr -= ((nr ^ (nr-1)) & nr);
        nr = (nr & (nr-1));
    }

    return rez;
}

void update(int nr, int lun, vector<int> &aib)
{
    int n = aib.size() - 1;
    while (nr <= n) {
        aib[nr] = max(aib[nr], lun);
        nr += ((nr ^ (nr-1)) & nr);
    }
}