[数据约束和评分方法]
60%的测试数据中:1<=N <= 1 000
100%的测试数据中:1<=N <= 20 000ios
/* 考虑LCS如何优化。 由于在作LCS时,只有a[i]==b[j],才会加一,并且这道题相同的只有五个,因此能够提早把位置记下来,用一维数组转移。 即f[i]=max(f[j]+1) a[i]==b[j],用树状数组维护一下最大值。 */ #include<cstdio> #include<iostream> #define N 100010 using namespace std; int f[N],pos[N][6],mx[N],n; int query(int x){ int ans=0; for(;x>0;x-=(x&-x))ans=max(ans,f[x]); return ans; } void change(int x,int v){ for(;x<=n*5;x+=(x&-x))f[x]=max(f[x],v); } int main(){ scanf("%d",&n); for(int i=1;i<=n*5;i++){ int x;scanf("%d",&x); pos[x][++pos[x][0]]=i; } int ans=0; for(int i=1;i<=n*5;i++){ int x;scanf("%d",&x); for(int j=5;j>=1;j--){ int k=pos[x][j]; f[k]=max(f[k],query(k-1)+1); change(k,f[k]); ans=max(ans,f[k]); } } printf("%d",ans); return 0; }