Cod sursa(job #1615041)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 26 februarie 2016 13:16:17
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <algorithm>

using namespace std;

const int MAX_N = 100000;

int Q[MAX_N]; // Q[i] = valoarea minima in care se poate termina un subsir de lungime i
int pos[MAX_N];
int redo[MAX_N];
int V[MAX_N];

int main() {
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin.tie(0);
    ios_base::sync_with_stdio(false);

    int N; fin >> N;
    int scm = 1;

    for (int i = 0; i < N; ++ i) {
        fin >> V[i];
        if (V[i] > Q[scm - 1]) {
            pos[i] = scm++;
        } else {
            pos[i] = lower_bound(Q, Q + scm, V[i]) - Q;
        }
        Q[pos[i]] = V[i];
    }

    fout << (--scm) << '\n';

    int need = scm;
    for (int i = N - 1; i >= 0; -- i) {
        if (pos[i] == need) {
            redo[--need] = V[i];
        }
    }
    for (int i = 0; i < scm; ++ i) {
        fout << redo[i] << " \n"[i == scm - 1];
    }
    fout << '\n';
    fout.close();
    return 0;
}