Cod sursa(job #3277287)

Utilizator jumaracosminJumara Cosmin-Mihai jumaracosmin Data 15 februarie 2025 17:01:23
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <bits/stdc++.h>

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

const int SIZE = 1e5 + 5;

// k = dimensiunea maxima a unui subsir crescator
// origin[] = vectorul de numere
// v[i] = elementul de pe pozitia i din subsirul crescator
// poz[i] = lungimea unui subsir ce se termina cu origin[i]

int n, x, k;
int v[SIZE], poz[SIZE], origin[SIZE];
std::vector<int> stack;

int64_t max(std::vector<int64_t> v){ return *std::max_element(v.begin(), v.end()); }

int64_t min(std::vector<int64_t> v){ return *std::min_element(v.begin(), v.end()); }

int main() 
{
    
    fin >> n;
    for(int i = 1; i <= n; ++i)
    {
        // elementul din sir
        fin >> x;
        origin[i] = x;
        // cautam binar in vectorul v unde am putea pune elementul x folosind lower_bound()
        // avem de la 1 la k, pt ca la un moment dat asta este intervalul posibil de lungimi
        int pos = std::lower_bound(v + 1, v + k + 1, x) - v;
        // elementul de pe pozitia pos in subsir este x
        v[pos] = x;
        // lungimea unui subsir ce se termina cu origin[i]
        poz[i] = pos;
        // update la dimensiunea maxima 
        k = max({k, poz[i]});
    }
    // afisez lungimea maxima
    fout << k << "\n";
    // parcurg sirul [dr->st], daca poz[i] = k <=> am gasit un canditat, il bag in stiva si decrementez k
    for(int i = n; i >= 1; --i)
        if(poz[i] == k)
            stack.push_back(origin[i]), k--;
    // afisez subsirul din stiva
    while(!stack.empty())
    {
        fout << stack.back() << " ";
        stack.pop_back();
    }

    return 0;
}