Cod sursa(job #2205401)

Utilizator berindeiChesa Matei berindei Data 19 mai 2018 00:15:41
Problema Subsir crescator maximal Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
/// dp[i]=max(dp[j], v[j]<v[i])+1
#include <bits/stdc++.h>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int const DIM =  1e5+100;

int dp[DIM], last[DIM];
int v[DIM];

int binara(int left, int right, int elem){
    if (left==right) return left;
    int mid=(left+right+1)/2;
    if (elem<last[mid]) return binara(left, mid-1, elem);
    else return binara(mid, right, elem);
}

int main(){
    int n, i, nr;
    in >> n;
    int lmax=0;
    for (i=1; i<=n; i++){
        in >> nr;
        v[i]=nr;
        if (nr>last[lmax]){
            last[++lmax]=nr;
            dp[i]=lmax;
            continue;
        }
        int poz=binara(0, lmax, nr);
        dp[i]=poz+1;
        if (last[poz+1]>nr) last[poz+1]=nr;
    }
    out << lmax << '\n';
    vector<int> ans;
    for (i=n; i>=1; i--)
        if (dp[i]==lmax){
            ans.push_back(v[i]);
            lmax--;
        }
    reverse(ans.begin(), ans.end());
    for (auto x: ans)
        out << x << ' ';
}