Cod sursa(job #3178603)

Utilizator patrick_burasanPatrick Burasan patrick_burasan Data 1 decembrie 2023 22:54:20
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

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

int N;
vector<int> a;
vector<int> p;
vector<int> dp;


int binarySearch(int x, int n, vector<int> &a) {
    int l, r, m, p;
    l = 1;
    r = n;
    while (l <= r) {
        m = (l + r) / 2;
        if (a[m] >= x) {
            p = m;
            r = m - 1;
        } else {
            l = m + 1;
        }
    }
    return p;
}

void citire() {
    fin >> N;
    a.resize(N + 1);
    p.resize(N + 1);
    dp.resize(N + 1);
    for (int i = 1; i <= N; i++)
        fin >> a[i];
}

void solve() {
    int lg;
    dp[1] = a[1];
    p[1] = 1;
    lg = 1;
    for (int i = 2; i <= N; i++) {
        if (dp[lg] < a[i]) {
            dp[++lg] = a[i];
            p[i] = lg;
        } else {
            int poz = binarySearch(a[i], lg, dp);
            dp[poz] = a[i];
            p[i] = poz;
        }
    }
    fout << lg << '\n';
    vector<int> ans;
    for (int j = N, i = lg; j >= 1; j--)   
        if (p[j] == i) {
            ans.push_back(a[j]);
            i--;
        }
    reverse(ans.begin(), ans.end());
    for (auto it : ans)
        fout << it << ' ';
    fout << '\n';
}

int main() {
    citire();
    solve();
    fin.close();
    fout.close();
    return 0;
}