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;
}
posted @ 2023-04-05 14:58  N0zoM1z0  阅读(13)  评论(0编辑  收藏  举报