题意:
给出两个1~n的排列
求最长公共子序列
我好菜啊
#include<cstdio>
#include<algorithm>
#define N 100005
using namespace std;
int n,len,a[N],b[N],pos[N];
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
int a=0;char f=1,c=nc();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=nc();}
while(c>='0'&&c<='9'){a=a*10+c-'0';c=nc();}
return a*f;
}
int main(){
n=read();
for(int i=1;i<=n;++i) a[i]=read(),pos[a[i]]=i;
for(int i=1;i<=n;++i){
int tmp=read();
b[i]=pos[tmp];
pos[tmp]=0;
}
// for(int i=1;i<=n;++i) printf("%d ",b[i]);
for(int i=1;i<=n;++i)
if(b[i]>pos[len]) pos[++len]=b[i];
else{
int tmp=lower_bound(pos+1,pos+len+1,b[i])-(pos+1);
pos[tmp+1]=b[i];
}
printf("%d\n",len);
return 0;
}