题目
思路
找第二个数组在第一个数组中出现的下标,然后对下标找最长上升子序列
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define lowbit(x) x&(-x)
int n;
int a[100010],b[100010],dp[100010],bit[100010];
map<int,int> mp;
void add(int x,int d){
for(int i=x;i<=n;i+=lowbit(i)){
bit[i]=max(bit[i],d);
}
}
int query(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res=max(res,bit[i]);
}
return res;
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
mp[a[i]]=i;
}
for(int i=1;i<=n;i++){
cin>>b[i];
b[i]=mp[b[i]];
}
int res=0;
for(int i=1;i<=n;i++){
int maxn=0;
dp[i]=query(b[i])+1;
res=max(res,dp[i]);
add(b[i],dp[i]);
}
cout<<res<<endl;
}