[模板] 最长上升子序列

传送门

看题解做的。

想一想最长上升子序列,有一个NlogN的做法。

也就是说如果我们把大小按12345排,改成按a[1]a[2]a[3]a[4]排,就可以求一个b的最长上升子序列。

并且这个b的子序列在a中一定存在,且最长.

#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 100005

int w[MAXN],b[MAXN];
int N,len;

inline int find(int x) {
    int l = 1; int r = len;
    while(l<r) {
        int mid = (l+r) >> 1;
        if(w[mid]>x) r = mid;
        else l = mid + 1;
    }
    return w[l]>x ? l : 0;
}

int main() {

    int a;
    scanf("%d",&N);
    for(int i=1;i<=N;++i) {
        scanf("%d",&a);
        w[a] = i;
    }

    for(int i=1;i<=N;++i) {
        scanf("%d",&b[i]); 
        b[i] = w[b[i]];
    }

    len = 0; w[0] = 0;
    for(int i=1;i<=N;++i) {
        if(w[len]<b[i]) w[++len] = b[i];
        else {
            int pos = find(b[i]);
            if(pos!=0&&pos<=len) w[pos] = b[i];
        }
    }

    printf("%d",len);
    return 0;
}
posted @ 2019-02-16 10:01  Neworld1111  阅读(165)  评论(0)    收藏  举报