Cod sursa(job #1606613)

Utilizator andreiudilaUdila Andrei andreiudila Data 20 februarie 2016 13:43:01
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>
#include <cstdio>
#define MAXN 100050
 
int din[MAXN], a[MAXN], sz, n; /// a[din[i]] = cel mai mic nr la care se termina un subsir de lungime i
int prev[MAXN]; /// reconstituire
int sol[MAXN], nq;
 
int getInd(int nr)
{
    /// cel mai mare indice cu din[i] < nr
    int step, rez;
    for (step = 1; step << 1 <= sz; step <<= 1);
    for (rez = 0; step; step >>= 1)
        if (rez+step <= sz && a[din[rez+step]] < nr)
            rez += step;
    return rez;
}
 
void solve()
{
    din[1] = 1; sz = 1;
    a[0] = 0x7fffffff;
    for (int i = 2; i <= n+1; i++) din[i] = 0;
    for (int i = 2; i <= n; i++) {
        int ind = getInd(a[i]);
        if (a[i] < a[din[ind+1]]) {
            prev[i] = din[ind];
            din[ind+1] = i;
        }
        sz = std::max(sz, ind+1);
    }
}
 
void afisare()
{
    printf("%d\n", sz);
    for (int i = 1, k = din[sz]; i <= sz; i++, k = prev[k])
        sol[++nq] = a[k];
    for (int i = nq; i; --i)
        printf("%d ", sol[i]);
}
 
int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
 
    scanf("%d ", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d ", &a[i]);
    solve();
    afisare();
    return 0;
}