Description
Input
第一行n
第二行和第三行分别是城市编号
Output
答案
Sample Input
5
1 4 5 2 3
3 4 2 1 5
Sample Output
3
Data Constraint
n<=100000
Solution
是一个简单的LIS模型
第一行分别编号为1~n
对应到第二行后,答案就是最长下降子序列
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 100100
using namespace std;
int n,a[N],b[N],c[N],f[N],h=1,t=0,ans=0;
int find(int x)
{
int l=1,r=h;
for(;l+1<r;)
{
int m=(l+r)/2;
if(a[m]<x) r=m;else l=m;
}
if(a[l]<x) r=l;return r;
}
int main()
{
scanf("%d",&n);
fo(i,1,n) scanf("%d",&a[i]),b[a[i]]=i;
fo(i,1,n) scanf("%d",&c[i]),c[i]=b[c[i]],f[i]=-2147483;
f[0]=0;a[1]=0;b[1]=1;
fo(i,1,n)
{
if(c[i]<a[h]) a[++h]=c[i],f[i]=h;
{
int k=find(c[i]);
f[i]=k;a[k]=c[i];
}
ans=max(ans,f[i]);
}
printf("%d",ans);
}