Cod sursa(job #2416897)

Utilizator aurelionutAurel Popa aurelionut Data 28 aprilie 2019 15:31:01
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

const int NMAX = 100005;
int n, v[NMAX], dp[NMAX], mn[NMAX], m;

int BS(int val)
{
    if (val > mn[m])
        return ++m;
    int left = 1, right = m, mid, pos;
    while (left <= right)
    {
        mid = (left + right) / 2;
        if (mn[mid] >= val)
        {
            pos = mid;
            right = mid - 1;
        }
        else
            left = mid + 1;
    }
    return pos;
}

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> n;
    for (int i = 1;i <= n;++i)
        fin >> v[i];
    dp[1] = 1;
    mn[++m] = v[1];
    for (int i = 2;i <= n;++i)
    {
        int p = BS(v[i]);
        mn[p] = v[i];
        dp[i] = p;
    }
    vector <int> sol;
    int pred = 2000000001;
    for (int i = n;i >= 1;--i)
    {
        if (dp[i] == m && v[i] < pred)
        {
            sol.push_back(v[i]);
            --m;
            pred = v[i];
        }
    }
    reverse(sol.begin(), sol.end());
    fout << sol.size() << "\n";
    for (int i = 0;i < sol.size();++i)
        fout << sol[i] << " ";
    fin.close();
    fout.close();
    return 0;
}