Cod sursa(job #2800285)

Utilizator vmnechitaNechita Vlad-Mihai vmnechita Data 13 noiembrie 2021 16:10:50
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.24 kb
/*
Subsir crescator maximal
Fie un vector a cu N elemente. Numim subsir al lui a de lungime K un vector a' = (ai1, ai2, ..., aiK) astfel incat sa avem i1 < i2 < ... < iK.

Cerinta
Sa se determine un subsir al lui a care este ordonat strict crescator si care are lungimea maxima.

Date de intrare
Fisierul de intrare scmax.in contine pe prima linie numarul N reprezentand numarul de elemente ale vectorului a . Pe cea de-a doua linie se afla N numere naturale reprezentand elementele vectorului a.

Date de iesire
In fisierul de iesire scmax.out se va afisa pe prima linie Lmax, lungimea celui mai lung subsir crescator al sirului a. Pe cea de-a doua linie se vor afla Lmax numere naturale reprezentand cel mai lung subsir crescator al vectorului a. Daca exista mai multe solutii se poate afisa oricare.

Restrictii
1 ≤ N ≤ 100 000
1 ≤ ai ≤ 2 000 000 000, pentru orice i de la 1 la N
Se acorda 50% din punctaj daca este afisata corect doar lungimea celui mai lung subsir crescator
*/
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define NMAX 100005

using namespace std;

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

vector < int > v, R;

int main()
{
    int n, i, st, dr, mij, r, a[NMAX], best[NMAX] = {0}, prec[NMAX] = {0};

    fin >> n;
    for(i = 1; i <= n; i++) fin >> a[i];

    prec[1] = 0, best[1] = 1, v.pb(1);
    for(i = 2; i <= n; i++)
    {
        if(a[i] > a[v[v.size()-1]]) prec[i] = v[v.size()-1], best[i] = best[prec[i]] + 1, v.pb(i);
        else
        {
            r = -1, st = 0, dr = v.size() - 1;
            while(st <= dr)
            {
                mij = (st + dr) / 2;
                if(a[v[mij]] < a[i]) r = mij, st = mij + 1;
                else dr = mij - 1;
            }

            v[r+1] = i;
            if(r == -1) prec[i] = 0, best[i] = 1;
            else prec[i] = v[r], best[i] = best[prec[i]] + 1;
        }
    }

    for(i = 1; i <= n; i++) if(best[i] == v.size()) break;

    while(i != 0) R.pb(a[i]), i = prec[i];

    fout << v.size() << '\n';
    for(i = R.size() - 1; i >= 0; i--) fout << R[i] << ' ';


    return 0;
}

/*
IN:
5
24 12 15 15 19

OUT:
3
12 15 19
*/