黄学长模拟day1 球的序列

N个编号为1-n的球,每个球都有唯一的编号。这些球被排成两种序列,分别为A、B序列,现在需要重新寻找一个球的序列l,对于这个子序列l中任意的两个球,要求j,k(j<k),都要求满足lj在A中位置比lk在A中位置靠前,却lj在B中位置比lk在B中位置靠前,请你计算这个子序列l的最大长度。

输入:

第一行一个整数,表示N。

第二行N个整数,表示A序列。

第三行N个整数,表示B序列。

 

样例输入

5

1 2 4 3 5

5 2 3 4 1

 

样例输出

2

样例说明

L可以是{2,3},也可以是{2,4}

 

数据范围:

40% N<=5000

100% N<=50000

/*
最长上升子序列
*/
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define fo(i,l,r) for(int i = l;i <= r;i++)
using namespace std;
const int maxn = 50050;
inline int read(){
    char ch=getchar();
    int f=1,x=0;
    while(!(ch>='0'&&ch<='9')){if(ch=='-')f=-1;ch=getchar();};
    while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();};
    return x*f;
}
int n,a[maxn],b[maxn],tran[maxn],d[maxn],g[maxn];
int main(){
    n = read();
    fo(i,1,n) a[i] = read();
    fo(i,1,n){
        b[i] = read();
        tran[b[i]] = i;
    }
    fo(i,1,n){
        b[tran[a[i]]] = i;
    }
    memset(g,127/3,sizeof(g));
    int ans = 0;
    fo(i,1,n){
        int k = lower_bound(g+1,g+1+n,b[i]) - g;
        d[i] = k;
        g[k] = b[i];
        ans = max(ans,d[i]);
    }
    cout<<ans;
    return 0;
}

 

posted @ 2016-10-23 20:31  ACforever  阅读(217)  评论(0编辑  收藏  举报