Cod sursa(job #1364283)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 27 februarie 2015 16:31:56
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
#include <cstdio>
#include <algorithm>
#include <vector>

#define DIM 3666013

using namespace std;

char buffer[DIM];
int poz = DIM - 1;

void Scanf(int &A){
    A = 0;
    while('0' > buffer[poz] || buffer[poz] > '9')
        if(++poz == DIM)
            fread(buffer,1,DIM,stdin),poz = 0;
    while('0' <= buffer[poz] && buffer[poz] <= '9')
    {
        A = A * 10 + buffer[poz] - 48;
        if(++poz == DIM)
            fread(buffer,1,DIM,stdin),poz = 0;
    }
}



vector<int> D,DP,daddy,pozitie,sol;
int N;


void Read()
{
    Scanf(N);
    D.resize(N);
    daddy.resize(N);
    for(int i = 0; i < N; ++i)
        Scanf(D[i]);
}

void Dynamic()
{
    int crt,best,pzbest,pz;
    for(int i = 0; i < N; ++i)
    {
        crt = D[i];

        pz = lower_bound(DP.begin(),DP.end(),crt) - DP.begin();
        if(pz == DP.size()){
            DP.push_back(D[i]);
            pozitie.push_back(i);
            if(pz)
                daddy[i] = pozitie[pz - 1];
            continue;
        }
        DP[pz] = D[i];
        pozitie[pz] = i;
        if(pz)
            daddy[i] = pozitie[pz-1];
    }
}


void Print()
{
    int pz = pozitie[DP.size()-1];
    printf("%d\n",DP.size());
    for(int i = DP.size(); i >= 1; --i){
        sol.push_back(D[pz]);
        pz = daddy[pz];
    }
    for(int i = DP.size() - 1; i >= 0; --i)
        printf("%d ",sol[i]);
}

int main()
{
    freopen("scmax.in","r",stdin);
    freopen("scmax.out","w",stdout);

    Read();
    Dynamic();
    Print();

    return 0;
}