P1439 ERLIS模板
【模板】最长公共子序列
题目描述
给出 \(1,2,\ldots,n\) 的两个排列 \(P_1\) 和 \(P_2\) ,求它们的最长公共子序列。
输入格式
第一行是一个数 \(n\)。
接下来两行,每行为 \(n\) 个数,为自然数 \(1,2,\ldots,n\) 的一个排列。
输出格式
一个数,即最长公共子序列的长度。
样例 #1
样例输入 #1
5
3 2 1 4 5
1 2 3 4 5
样例输出 #1
3
提示
- 对于 \(50\%\) 的数据, \(n \le 10^3\);
- 对于 \(100\%\) 的数据, \(n \le 10^5\)。
用都为1~n的排列这一条件 建立一个映射过后用 ERLIS即可
注意 pos=lower_bound(d+1,d+n+1,a[i])-a 不是 -(a+1) 相当于指针-指针
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int d[N],a[N],b[N],c[N],len,n;
signed main() {
ios::sync_with_stdio(false);
cin>>n;
for(int i=1; i<=n; i++)cin>>b[i],c[b[i]]=i;
for(int i=1; i<=n; i++) {
int x;
cin>>x;
a[i]=c[x];
}
len=1;
d[1]=a[1];
for(int i=2; i<=n; i++) {
if(d[len]<a[i])d[++len]=a[i];
else {
int pos=lower_bound(d+1,d+len+1,a[i])-d;//!!!
d[pos]=a[i];
}
}
cout<<len<<"\n";
return 0;
}