Cod sursa(job #2945484)

Utilizator lucaxsofLuca Sofronie lucaxsof Data 23 noiembrie 2022 20:11:51
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <bits/stdc++.h>
using namespace std;

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

#define pb(x) push_back(x)

const int NMAX = 1e5 + 5;

int N, v[NMAX], temp[NMAX], r[NMAX];

int max_len, start_sol;

void read()
{
    fin >> N;

    for (int i = 1; i <= N; ++i)
        fin >> v[i];
}

int bs(int x)
{
    int st = 1, dr = max_len, mid, maybe = 0;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (v[temp[mid]] < x)
            maybe = mid, st = mid + 1;
        else
            dr = mid - 1;
    }
    return maybe;
}

void solution()
{
    for (int i = 1; i <= N; ++i)
    {
        int ind = bs(v[i]);         //indexul nr la care il pot lega pe v[i];
        if (max_len < ind + 1)       //acum vezi daca trebuie sa-l pui la finalul vectorului sau nu
        {
            max_len = ind + 1;
            start_sol = i;
        }
        temp[ind + 1] = i;
        r[i] = temp[ind];     //pui de la cine vine (nu de la cine vine ala de la care vine)
    }
    fout << max_len;
    vector<int> ans;
    while (max_len)
    {
        ans.push_back(start_sol);
        start_sol = r[start_sol];
        max_len--;
    }
    reverse(ans.begin(), ans.end());

    fout << '\n';

    for (auto g : ans)
        fout << v[g] << ' ';
}

int main()
{
    ios::sync_with_stdio(false);
    fin.tie(NULL);
    read();
    solution();
}