看题解做的。
想一想最长上升子序列,有一个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;
}