luogu P1439 【模板】最长公共子序列(LCS)

题目qwq

(第一道蓝题)

先把第一个序列每个数出现的顺序记下来(数字本身不用记),

然后第二个序列的每个数都对照它的顺序,这样只要得到一个升序的序列就行了qwq

如果遇到出现顺序在前面的数,就用二分法找一下它的位置,然后把原来存下来的顺序覆盖掉

#include<cstdio>
using namespace std;
int f[100005],ans[100005];
int n,sum;
int k,l,r,now,mid;
int main() {
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) {
        scanf("%d",&k);
        f[k] = i;
    }
    for(int i = 1; i <= n; i++) {
        scanf("%d",&k);
        now = f[k];
        if(now > ans[sum])
            ans[++sum] = now;
        else {
            l = 1,r = sum;
            while(l < r) {
                mid = (l+r)/2;
                if (ans[mid]<now)l = mid+1;
                else r = mid;
            }
            ans[l] = now;
        }
    }
    printf("%d",sum);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/mogeko/p/9859379.html