Cod sursa(job #988769)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 23 august 2013 20:09:20
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#define FOR(i,a,b) for(int i= (a) ; i <= (b); ++i)
#define Nmax 100666
int D[ Nmax ],L[ Nmax ],best[ Nmax ],dupa[ Nmax ],besti[ Nmax ],n,nrb=1;
void update(int poz){
    int li = 1,lf = nrb,m;
    while(li <= lf){    // caut binar unde pot plasa val curenta
        m = li + (lf - li) / 2;
        if( best[ m ] < D[ poz ] ) li = m + 1;
        else if(best[ m ] >= D[ poz ])lf = m - 1;
    }
    if(lf + 1 > nrb)++nrb;
    if(best[lf + 1] > D[ poz ]){
    best[lf + 1] = D[ poz ];
    besti[lf + 1] = poz; // imi notez tatal valorii la update
    }
    L[ poz ] = lf + 1; // actualizez lungimea valorii curente
    dupa[ poz ]=besti[ lf ]; // notez tatal valorii curente

}

void afish(){
    n = besti[ nrb ]; // fol n sa tin minite lungimea scmax
    besti[ 0 ] = nrb; // retin si aici lungimea scmax
    do{// scriu solutia in ordine inversa
    best[ nrb-- ] = D[n];
    n=dupa[n];
    }while(dupa[n]);
    printf("%d\n",besti[ 0 ]);
    FOR(i,1,besti[0])printf("%d ",best[ i ]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);
    scanf("%d\n",&n);
    FOR(i, 1, n){
        scanf("%d",&D[ i ]);
        best[ i ] = 2000000666;
        update(i);
    }
    afish();
    return 0;
}