跳转至

最长不下降子序列

#include<bits/stdc++.h>
#define Maxn 100000
using namespace std;
int a[Maxn+5],d[Maxn+5],p[Maxn+5],pre[Maxn+5];
vector<int> ans;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%d",a+i);
    int k=0;
    for(int i=0;i<n;i++)
    {
        int tmp=upper_bound(d,d+k,a[i])-d; //最长不下降子序列
        // int tmp=lower_bound(d,d+k,a[i])-d; 最长上升子序列
        pre[i]=tmp?p[tmp-1]:-1;
        d[tmp]=a[i];
        p[tmp]=i;
        if(tmp==k) k++;
    }
    for(int i=p[k-1];i!=-1;i=pre[i]) ans.push_back(a[i]);
    printf("%d\n",ans.size());
    for(int i=ans.size()-1;i>=0;i--) printf("%d ",ans[i]);
    return 0;
}