ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】P1439 【模板】最长公共子序列

2021-03-07 09:33:02  阅读:175  来源: 互联网

标签:int 题解 mid len P1439 100010 序列 模板 mp


P1439 【模板】最长公共子序列

题解

f[]维护当前最长的公共子序列,f[i]是这条子序列的第i个数在a中的位置。易知f[]是递增的。
对于b的第i个数b[i],找到其在a中的位置mp[b[i]],如果mp[b[i]]大于f[len],说明b[i]这个数可以加到当前最长子序列后面。
不然的话要想把b[i]这个数加到子序列里,我们可以根据f[]单调的性质二分在f[]中找到mp[b[i]]的位置f[l]。由于同样长的一条链的最后一个元素,他在a[]中出现的位置靠前一些,答案就越不会更差,所以如果f[l]要比mp[b[i]]大,就更新。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n, a[100010], b[100010], mp[100010], f[100010]/*以b[i]为结尾的最长公共子序列在a中的位置*/, len;
int main(){
	scanf("%d",&n);
	for(int i = 1; i <= n; ++i){
		scanf("%d", &a[i]);
		mp[a[i]] = i;
	}	
	for(int i = 1; i <= n; ++i)	scanf("%d", &b[i]);
	for(int i = 1; i <= n; ++i){
		int l = 0, r = len, mid;
		if(mp[b[i]] > f[len])	f[++len] = mp[b[i]];
		else{
			while(l < r){
				mid = l + r >> 1;
				if(f[mid] > mp[b[i]])	r = mid;
				else l = mid + 1;
			}
			f[l] = min(mp[b[i]], f[l]);
		} 
	}
	printf("%d\n", len);
	return 0;
}

标签:int,题解,mid,len,P1439,100010,序列,模板,mp
来源: https://www.cnblogs.com/ZhengkunJia/p/14493535.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有