Cod sursa(job #2568528)

Utilizator trifangrobertRobert Trifan trifangrobert Data 4 martie 2020 00:33:07
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.2 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100005;
int N, v[NMAX];
int lis[NMAX], len, dp[NMAX];

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

int main()
{
    ifstream fin("scmax.in");
    ofstream fout("scmax.out");
    fin >> N;
    for (int i = 1;i <= N;++i)
        fin >> v[i];
    for (int i = 1;i <= N;++i)
    {
        int p = BinarySearch(v[i]);
        dp[i] = p;
    }
    int pred = 2000000001;
    vector <int> answer;
    for (int i = N;i >= 1;--i)
        if (dp[i] == len && v[i] < pred)
        {
            pred = v[i];
            --len;
            answer.push_back(v[i]);
        }
    fout << answer.size() << "\n";
    reverse(answer.begin(), answer.end());
    for (auto&x : answer)
        fout << x << " ";
    fin.close();
    fout.close();
    return 0;
}