Cod sursa(job #2573741)

Utilizator popoviciAna16Popovici Ana popoviciAna16 Data 5 martie 2020 18:58:06
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <fstream>
using namespace std;

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

//AUR CURAT: https://stackoverflow.com/questions/2631726/how-to-determine-the-longest-increasing-subsequence-using-dynamic-programming

int a[100001], s[100001], sol[100001], p[100001];
int k;

int cb(int ind)
{
    //caut a[s[k]] minim, a.i. a[s[k]] >= a[ind] (si daca am a[s[k]] minim, atunci am si k minim)
    int st = 1, dr = k, mij;
    while (st<=dr)
    {
        mij = (st+dr)>>1;
        if (a[s[mij]] >= a[ind])
            dr = mij - 1;
        else
            st = mij + 1;
    }
    return st;
}

int main()
{
    int i, n, j, poz;
    fin >> n;
    for (i = 1; i<=n; i++)
        fin >> a[i];
    s[1] = 1;
    k = 1;
    for (i = 2; i<=n; i++)
    {
        if (a[i] > a[s[k]])
        {
            p[i] = s[k];
            k++;
            s[k] = i;
        }
        else
        {
            poz = cb(i);
            p[i] = s[poz-1];
            s[poz] = i;
        }
    }
    fout << k << '\n';
    for (i = 1, j = s[k]; i<=k; i++, j = p[j])
        sol[i] = j;
    for (i = k; i>=1; i--)
        fout << a[sol[i]] << ' ';
    return 0;
}