Cod sursa(job #2916652)

Utilizator oaspruOctavian Aspru oaspru Data 31 iulie 2022 10:40:24
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
using namespace std;
ifstream cin("scmax.in");
ofstream cout("scmax.out");
int i,j,n,m,L,st,dr,mid,aux,k;
int v[100005],D[100005],t[100005],x[100005];
int main()
{
    cin>>n;
    for(i=1;i<=n;++i)
        cin>>v[i];
    /// sursa complexitate nlog(n)
    /// La un pas i avem L = lungimea maxima a unui subsir crescator cu elemente de pe pozitii <=i
    /// la pas i tinem un vector D cu L elemente (indici din v) in care
    /// v[D[j]] = val minima  dintre pozitiile 1 si i in care se termina un subsir crescator de lungime j
    for(i=1;i<=n;++i)
    {
        if(v[i]>v[D[L]])
            D[++L]=i,t[D[L]]=D[L-1];
        else
        {
            st=1;
            dr=L;
            while(st<=dr)
            {
                mid=(st+dr)/2;
                if(v[i]>v[D[mid]])
                    st=mid+1;
                else
                    dr=mid-1;
            }
            D[dr+1]=i;
            t[D[dr+1]]=D[dr];
 
        }
    }
    cout<<L<<"\n";
    aux=D[L];
    while(aux)
        x[++k]=aux,aux=t[aux];
    for(i=k;i>=1;--i)
        cout<<v[x[i]]<<' ';
    return 0;
}