Cod sursa(job #2674812)

Utilizator seburebu111Mustata Dumtru Sebastian seburebu111 Data 20 noiembrie 2020 13:12:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
/*
#include <iostream>

using namespace std;

int main()
{
    int n, a[100001];
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    int dp[100001];
    for(int i=1; i<n; i++)
    {
        dp[i]=1;
        for(int j=i-1; j>=1; j--)
        {
            if(a[i]>a[j])
                dp[i]=max(dp[i], 1+dp[j]);
        }
    }
    int imax=1, maxm=1;
    for(int i=1; i<=n; i++)
    {
        if(maxm<dp[i])
        {
            maxm=dp[i];
            imax=i;
        }
    }
    cout<<maxm<<'\n';
    int cnt=maxm-1;
    while(cnt)
    {
        for(int i=imax; i>=1; i--)
            if(dp[i]==cnt &&    )
            {
                cout<<a[i]<<' ';
                cnt--;
            }
    }
    return 0;
}
*/

#include <fstream>

using namespace std;

const int N=100000;

int v[N], l[N], vmin[1+N], n, m;

ifstream in("scmax.in");
ofstream out("scmax.out");

void subsir(int p)
{
    int i = p - 1;
    while (i >= 0 && (v[i] >= v[p] || l[i] != l[p] - 1))///n-am gasit predecesorul lui v[p]
    {
        i--;
    }
    if (i >= 0)
    {
        subsir(i);
    }
    out<<v[p]<<' ';
}

int cautbin(int x)
{
    ///caut cel mai mic j cu vmin[j] >= x
    if (x > vmin[m])
    {
        return 1 + m;
    }
    int st = 1, dr = m;
    while (st < dr)
    {
        int mijloc = (st + dr) / 2;
        if (vmin[mijloc] >= x)
        {
            dr = mijloc;
        }
        else
        {
            st = mijloc + 1;
        }
    }
    return st;
}

int main()
{
    in>>n;
    for (int i = 0; i < n; i++)
    {
        in>>v[i];
    }
    l[0] = 1;
    vmin[++m] = v[0];
    for (int i = 1; i < n; i++)
    {
        int j = cautbin(v[i]);
        l[i] = j;
        if (j > m)
        {
            m++;
        }
        vmin[j] = v[i];
    }
    out<<m<<'\n';
    int imax = n - 1;
    while (imax >= 0 && l[imax] != m)
    {
        imax--;
    }
    subsir(imax);

    return 0;
}