Cod sursa(job #2930648)

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

void normalizare(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");    /// TODO!!!
    ofstream fout("scmax.out");

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

    normalizare(a);
    /*for (auto i : a)
        fout << i << ' ';
    fout << '\n';*/

    vector<int> aib(n+1);

    int sol = 0;

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

        int curr = lun + 1;
        sol = max(sol, curr);

        update(nr, curr, aib);
    }

    fout << sol;

    return 0;
}


void normalizare(vector<int> &a)
{
    vector<int> b = a;
    sort(b.begin(), b.end());
    unique(b.begin(), b.end());

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

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);
    }
}