Cod sursa(job #2737141)

Utilizator trifangrobertRobert Trifan trifangrobert Data 4 aprilie 2021 14:34:10
Problema Subsir crescator maximal Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 100000;
int N, v[1 + NMAX], dp[1 + NMAX];
int lis[1 + NMAX], sz;

int BinarySearch(int val) {
    if (val > lis[sz]) {
        lis[++sz] = val;
        return sz;
    }
    int left = 1, right = sz, mid, pos;
    while (left <= right) {
        mid = (left + right) / 2;
        if (lis[mid] >= val) {
            right = mid - 1;
            pos = mid;
        }
        else {
            left = mid + 1;
        }
    }
    lis[pos] = val;
    return pos;
}

int main() {
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> N;
    for (int i = 1; i <= N; ++i)
        fin >> v[i];
    for (int i = 1; i <= N; ++i) {
        dp[i] = BinarySearch(v[i]);
    }
    int last = 2e9 + 1;
    vector <int> answer;
    for (int i = N; i >= 1; --i) {
        if (dp[i] == sz && v[i] < last) {
            answer.push_back(v[i]);
            --sz;
            last = v[i];
        }
    }
    reverse(answer.begin(), answer.end());
    fout << answer.size() << "\n";
    for (auto& i : answer) {
        fout << i << " ";
    }
    fin.close();
    fout.close();
    return 0;
}