Cod sursa(job #2308615)

Utilizator HumikoPostu Alexandru Humiko Data 27 decembrie 2018 14:27:05
Problema Subsir crescator maximal Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, scm;
int v[100005];
int dp[100005];
int lmax[100005];
int ans[100005];

int binarySearch( int val, int pos )
{
    int left = 1;
    int right = pos;
    int last = 0;

    while ( left <= right )
    {
        int mid = left+(right-left)/2;

        if ( dp[mid] < val )
        {
            left = mid+1;
            last = mid;
        }
        else
            right = mid-1;
    }

    return last;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    fin>>n;
    for ( int i = 1; i <= n; ++i )
    {
        fin>>v[i];
        dp[i] = 2e9+1;
    }

    for ( int i = 1; i <= n; ++i )
    {
        int cur_len = binarySearch(v[i], scm);
        dp[cur_len+1] = min(dp[cur_len+1], v[i]);
        scm = max(scm, cur_len+1);
        lmax[i] = cur_len+1;
    }

    int pos = scm;
    int k = 0;

    for ( int i = n; i >= 1; --i )
    {
        if ( pos == lmax[i] )
        {
            pos--;
            ans[++k] = v[i];
        }
    }

    fout<<k<<'\n';

    for ( int i = k; i >= 1; --i ) fout<<ans[i]<<" ";
}