Cod sursa(job #1809782)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 19 noiembrie 2016 11:45:19
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>
#define NMAX 100010
using namespace std;

int V[NMAX], D[NMAX], L[NMAX], S[NMAX];
int N, i, p, best;


int bsearch(int x) {
    int s = 1, d = best, p = -1, m = 0;
    
    while (s <= d) {
        m = (s + d) >> 1;
        if (D[m] >= x) {
            p = m;
            d = m - 1;
        } else {
            s = m + 1;
        }
    }
    
    return p;
}


int main()
{
    freopen("scmax.in", "r", stdin);
    freopen("scmax.out", "w", stdout);
    
    scanf("%d", &N);
    for (i = 1; i <= N; i++) {
        scanf("%d", &V[i]);
    }
    
    for (i = 1; i <= N; i++) {
        p = bsearch(V[i]);
        if (p == -1) {
            best++;
            p = best;
        }
        
        D[p] = V[i];
        L[i] = p;
    }
    
    p = best;
    for (i = N; i > 0; i--) {
        if (L[i] == p && (p == best || V[i] <= S[p + 1])) {
            S[p--] = V[i];
        }
    }
    
    printf("%d\n", best);
    for (i = 1; i <= best; i++) {
        printf("%d ", S[i]);
    }
    
    printf("\n");
    return 0;
}