C++ & Java ——最长不下降序列—变式题

来源:互联网 发布:演唱会软件 编辑:程序博客网 时间:2024/05/21 18:45
题目描述
现有两个长度为 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;elseleft=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;elseleft=mid+1;}if(left>ans) ++ans;num[left]=b[i];}System.out.println(ans);}}