Cod sursa(job #2331046)

Utilizator AndreiVisoiuAndrei Visoiu AndreiVisoiu Data 29 ianuarie 2019 09:35:59
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
/// O(n*log(n))
/// Robison-Schensted-Knuth - RSK
#include <fstream>

using namespace std;

const int MAXN = 100001;
ifstream in("scmax.in");
ofstream out("scmax.out");

int N, a[MAXN], /// intrare
    L[MAXN], /// L[i] = adresa primului element din sirul a pentru care subsirul strict crescator are lungimea i
    P[MAXN], /// P[i] = poz elementului care urmeaza dupa a[i] in cel mai lung ssc care incepe cu a[i];
    lMax; /// lung max a unui ssc

int cautare(int p, int u, int x) {
    while(p <= u) {
        int m = (p+u)/2;
        if(x < a[L[m]])
            p = m+1;
        else
            u = m-1;
    }
    return p;
}

void dp() {
    for(int i = N; i >= 1; i--) {
        /// Prin cautare binare se det cea mai mare lungime k a unui ssc care sa il contina pe a[i]
        int k = cautare(1, lMax, a[i]);
        P[i] = L[k-1];
        if(k > lMax) {
            lMax = k;
            L[k] = i;
        } else
            if(a[L[k]] < a[i])
                L[k] = i;
    }
}

void afis() {
    out << lMax << '\n';
    for(int i = L[lMax]; i > 0; i = P[i])
        out << a[i] << ' ';
}

int main()
{
    in >> N;
    for(int i = 1; i <= N; i++)
        in >> a[i];
    dp();

    afis();
    return 0;
}