Cod sursa(job #2604011)

Utilizator EckchartZgarcea Robert-Andrei Eckchart Data 21 aprilie 2020 14:44:39
Problema Subsir crescator maximal Scor 95
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <unordered_map>
#include <vector>
#include <climits>
#include <algorithm>
using namespace std;
using L = long;
using UL = unsigned long;
const L INF = LONG_MAX;
UL N;
vector<L> nrs;
 
 
void print_LIS(UL i, unordered_map<UL, L> &prev)
{
    static ofstream fout("scmax.out", ios::app);
    
    if (prev[i] != -1)
    {
        print_LIS(prev[i], prev);
    }
    fout << nrs[i] << " ";
}
 
 
int main()
{
    ifstream fin("scmax.in");
 
    fin >> N;
    nrs.reserve(N);
    for (UL i = 0; i < N; ++i)
    {
        fin >> nrs[i];
    }
 
    vector<L> dp(N + 1, INF);
    unordered_map<L, L> indices;
    unordered_map<UL, L> prev;
 
    dp[0] = -INF;
    indices[-INF] = -1;
    for (UL i = 0; i < N; ++i)
    {
        UL j = upper_bound(dp.begin(), dp.end(), nrs[i]) - dp.begin();
        if (dp[j - 1] < nrs[i] && nrs[i] < dp[j])
        {
            dp[j] = nrs[i];
 
            prev[i] = indices[dp[j - 1]];
            indices[dp[j]] = i;
        }
    }
    
    ofstream fout("scmax.out");
 
    UL index_last_elem = lower_bound(dp.begin(), dp.end(), INF) - dp.begin() - 1;
    fout << index_last_elem << "\n";
 
    print_LIS(indices[dp[index_last_elem]], prev);
}