Cod sursa(job #921176)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 20 martie 2013 20:26:34
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<fstream>
#include<algorithm>
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");

int n, a[100001], dp[100001], c[100001], sol[100001];
int Caut(int x, int st, int dr)
{
    int poz = dr+1;
    while ( st <= dr)
    {
        int m = (st+dr)/2;
        if ( x <= c[m] )
            dr = m-1, poz = m;
        else st = m+1;
    }
    return poz;
}
int main()
{
    fin >> n;
    for ( int i = 1; i<= n; i++ )
        fin >> a[i];
    int sz=1;
    c[1] = a[1];
    dp[1]=1;
    for ( int i = 2; i<= n; i++ )
    {
        int k = Caut(a[i],1,sz);
        if(k<=sz)
            c[k]=a[i],dp[i]=k;
        else c[++sz]=a[i],dp[i]=sz;
    }
    fout<<sz<<'\n';
    int nr=sz;
    for(int i = n ;i; i-- )
        if ( dp[i]==sz )
            c[sz--]=a[i];;
    for ( int i=1; i<=nr; i++ )
        fout<<c[i] << ' ';
    fin.close();
    fout.close();
    return 0;
}