题目描述
现有两个长度为 n 的排列 A,B,需再寻找一个排列 C,使得对于 C 中任意两个数i,j(i<j),
满足Ci在A 中的位置比Cj 靠前,在 B 中位置也比Cj靠前,求这个排列 C 的最大长度
输入描述
现有两个长度为 n 的排列 A,B,需再寻找一个排列 C,使得对于 C 中任意两个数i,j(i<j),
满足Ci在A 中的位置比Cj 靠前,在 B 中位置也比Cj靠前,求这个排列 C 的最大长度
输入描述
注意:C 是序列不是排列。
输入描述
第一行一个数n,表示排列的长度
第二行 n 个正整数,为A 排列
第三行 n 个正整数,为B 排列
输出描述 Output Description
一行一个数表示排列 C的最大长度
【输入样例】
5
1 2 4 3 5
5 2 3 4 1
【输出样例】
2
数据范围及提示
C 可以为{2,3},也可{2,4}
对于40%的数据,n<=5000
对于100%的数据,n<=100000
#include<cstdio>
int n,ans;
int a[100001],b[100001],num[100001];
inline int readint()
{
int i=0;
char ch;
for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
for(;ch>='0' && ch<='9';ch=getchar())
i=(i<<3)+(i<<1)+ch-'0';
return i;
}
int main()
{
n=readint();
for(int i=1;i<=n;++i) a[readint()]=i;
for(int i=1;i<=n;++i) b[i]=a[readint()];
for(int i=1;i<=n;i++)
{
int left=1,right=ans;
while(left<=right)
{
int mid=(left+right)/2;
if(b[i]<=num[mid])
right=mid-1;
else
left=mid+1;
}
if(left>ans) ++ans;
num[left]=b[i];
}
printf("%d\n",ans);
return 0;
}
import java.util.*;
public class Main
{
static int [] a=new int [100001];
static int [] b=new int [100001];
static int [] num=new int [100001];
public static void main(String[] args)
{
int n,left,right,ans;
ans=0;
Scanner input=new Scanner(System.in);
n=input.nextInt();
for(int i=1;i<=n;++i)
a[input.nextInt()]=i;
for(int i=1;i<=n;++i)
b[i]=a[input.nextInt()];
for(int i=1;i<=n;++i)
{
left=1;
right=ans;
while(left<=right)
{
int mid=(left+right)/2;
if(b[i]<=num[mid])
right=mid-1;
else
left=mid+1;
}
if(left>ans) ++ans;
num[left]=b[i];
}
System.out.println(ans);
}
}