码迷,mamicode.com
首页 > 其他好文 > 详细

Luogu 1439 【模板】最长公共子序列

时间:2017-12-17 00:07:27      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:int   f11   序列   sam   观察   code   radius   nlogn   open   

题目描述

给出1-n的两个排列P1和P2,求它们的最长公共子序列。

输入输出格式

输入格式:

第一行是一个数n,

接下来两行,每行为n个数,为自然数1-n的一个排列。

输出格式:

一个数,即最长公共子序列的长度

输入输出样例

输入样例#1: 
5 
3 2 1 4 5
1 2 3 4 5
输出样例#1: 
3

说明

【数据规模】

对于50%的数据,n≤1000

对于100%的数据,n≤100000

【题解】

首先不难想到的是将其转化成一个序列的最长上升子序列

由于两个序列均为1~n的排列,在将其中一个序列的元素换成该元素在另一序列中的下标时,最长公共子序列即可写成一个最长上升子序列,其中每一项的值为在其中一个序列中的下标(由观察样例不难发现 因为样例给了一个序列为1 2 3 4 5,替换的想法较为明显)

然后就可以二分地做到O(nlogn)

技术分享图片
 1 //luogu P1439
 2 int n;
 3 int a[111111],b[111111];
 4 int dy[111111];
 5 int f[111111];
 6 int ans;
 7 
 8 int main(){
 9     n=read();
10     for(int i=1;i<=n;i++) a[i]=read(),dy[a[i]]=i;
11     for(int i=1;i<=n;i++) b[i]=read(),b[i]=dy[b[i]];
12     
13     for(int i=1;i<=n;i++){
14         if(b[i]>f[ans]){
15             ans++;
16             f[ans]=b[i];
17         }
18         else{
19             f[lower_bound(f+1,f+ans+1,b[i])-f]=b[i];
20         }
21     }
22     
23     print(ans);
24     return 0;
25 }
View Code

 

Luogu 1439 【模板】最长公共子序列

标签:int   f11   序列   sam   观察   code   radius   nlogn   open   

原文地址:http://www.cnblogs.com/nflslzt/p/8048079.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!