O(nlogn)的最长上升子序列并且记录所选择的数 模板

来源:互联网 发布:js文件下载 编辑:程序博客网 时间:2024/04/29 10:42
#include <iostream>#include <cstdlib>#include <cstdio>#include <cmath>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 10000 + 10;int A[MAXN];int lis[MAXN];int f[MAXN];int stack[MAXN];int N;int main(){    while(scanf("%d", &N)!=EOF)    {        for(int i=1;i<=N;i++)            scanf("%d", &A[i]);        int top = 1;        stack[1] = A[1];        f[1] = 1;        for(int i=2;i<=N;i++)        {            if(A[i] > stack[top])            {                stack[++top] = A[i];                f[i] = top;            }            else            {                int pos = lower_bound(stack, stack + top, A[i]) - stack;                stack[pos] = A[i];                f[i] = pos;            }        }        cout << top << endl;        int t = top;        for(int i=N;i>=1;i--)        {            if(f[i] == t)            {                lis[--t] = i;            }            if(t < 0) break;        }        for(int i=0;i<top;i++)         cout << lis[i] << ' ';        cout << endl;    }    return 0;}

0 0
原创粉丝点击