Description
Solution
我们把第一行的数与第二行相等的数相连,假设第i个数在第二行出现的位置为 ci ,如果 i,j 有交叉,那么要满足, i<j 且 ci>cj 。
那么这就是一个最长下降子序列了。
Code
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define N 100100
using namespace std;
struct node{
int x,y;
}q[N];
int a[N],b[N];
bool cmp(node x,node y)
{
return x.x<y.x;
}
int d[N],t=0;
int main()
{
int n;
cin>>n;
fo(i,1,n) scanf("%d",&a[i]);
fo(i,1,n) scanf("%d",&q[i].x),q[i].y=i;
sort(q+1,q+n+1,cmp);
fo(i,1,n) b[i]=q[a[i]].y;
d[0]=2147483647;
fo(i,1,n)
{
int l=0,r=t;
while(l+1<r)
{
int mid=(l+r)/2;
if(d[mid]>b[i]) l=mid;
else r=mid;
}
int q=l;
if(d[r]>b[i]) q=r;
d[q+1]=b[i];
if(q==t) t++;
}
cout<<t;
}