Cod sursa(job #2224733)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 24 iulie 2018 21:36:28
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

const string IN_FILE = "scmax.in";
const string OUT_FILE = "scmax.out";
const int INF = 0x3f3f3f3f;

vector<int> longestIncreasingSubsequence(const vector<int>& values) {
    const int n = int(values.size());
    auto dp = vector<int>({-INF});
    auto index = vector<int>({-1});
    auto parent = vector<int>(n, -1);
    for (int i = 0; i < n; i++) {
        const int length =
                lower_bound(dp.begin(), dp.end(), values[i]) - dp.begin();
        parent[i] = index[length - 1];
        if (length == int(dp.size())) {
            dp.push_back(values[i]);
            index.push_back(i);
        }
        if (dp[length] > values[i]) {
            dp[length] = values[i];
            index[length] = i;
        }
    }
    auto sequence = vector<int>();
    for (int i = index.back(); i != -1; i = parent[i]) {
        sequence.push_back(values[i]);
    }
    reverse(sequence.begin(), sequence.end());
    return sequence;
}

vector<int> readValues() {
    ifstream in(IN_FILE);
    int n;
    in >> n;
    auto values = vector<int>(n);
    for (int i = 0; i < n; i++) {
        in >> values[i];
    }
    in.close();
    return values;
}

void writeSequence(const vector<int>& sequence) {
    ofstream out(OUT_FILE);
    out << int(sequence.size()) << "\n";
    for (int i = 0; i < int(sequence.size()); i++) {
        out << sequence[i] << (i + 1 < int(sequence.size()) ? " " : "\n");
    }
    out.close();
}

int main() {
    const auto values = readValues();
    const auto sequence = longestIncreasingSubsequence(values);
    writeSequence(sequence);
    return 0;
}