Cod sursa(job #2800950)

Utilizator Andrei_TudorAndrei Tudor Andrei_Tudor Data 14 noiembrie 2021 15:57:00
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <vector>
#include <limits>
#include <algorithm>
#include <cassert>

using namespace std;

int binarySearch(const vector <int>& dp, const int& value) {
    return distance(dp.begin(), lower_bound(dp.begin(), dp.end(), value)) - 1;
}

int main(){
    ifstream cin ("scmax.in");
    ofstream cout ("scmax.out");
    int n;
    cin >> n;
    vector <int> values(n);
    for(int i = 0; i < n; ++ i){
        cin >> values[i];
    }
    vector <int> dp(n + 1, numeric_limits<int>::max());
    dp[0] = 0;
    vector <int> lengthToOriginalPosition(n + 1);
    lengthToOriginalPosition[0] = -1;
    vector <int> originalPositionToPreviousPosition(n + 1, -1);
    pair<int, int> best = {0, 0};
    for (int i = 0; i < n; i ++) {
        int k = binarySearch(dp, values[i]);
        dp[k + 1] = values[i];
        originalPositionToPreviousPosition[i] = lengthToOriginalPosition[k];
        lengthToOriginalPosition[k + 1] = i;
        best = max(best, {k + 1, i});        
    }
    cout << best.first << "\n";
    auto outputSequence = [&](auto&& self, int position) -> void {
        if (position == -1) {
            return;
        }
        self(self, originalPositionToPreviousPosition[position]);
        cout << values[position] << ' ';
    };
    outputSequence(outputSequence, best.second);
    return 0;
}