前言:
我个大SB树状数组都写挂贡献两发wa被ozyD飞。
题意:
有特殊条件的最长公共子序列。
题解:
dp+树状数组。
直接暴力dp显然不行,所以要优化。
因为每个数都只有5个,所以可以存下来。
对于一个数,只有这些位置是有贡献的,那么树状数组维护最大值就好了。
code:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
int a[7];
int num;
node(){num=0;}
} p[20010];
int n;
int ans=0,cn[100010],id[100010];
int s1[100010],s2[100010];
int tr[100010];
int lowbit(int x){return x&(-x);}
void change(int x,int c)
{
for(int i=x;i<=5*n;i+=lowbit(i))
tr[i]=max(tr[i],c);
}
int get(int x)
{
int re=0;
for(int i=x;i>=1;i-=lowbit(i))
re=max(re,tr[i]);
return re;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=5*n;i++) scanf("%d",&s1[i]);
for(int i=1;i<=5*n;i++) scanf("%d",&s2[i]);
for(int i=1;i<=5*n;i++)
p[s2[i]].a[++p[s2[i]].num]=i;
for(int i=1;i<=5*n;i++)
{
for(int j=5;j>=1;j--)
{
int x=p[s1[i]].a[j];
int mx=get(x-1);
ans=max(ans,mx+1);
change(x,mx+1);
}
}
printf("%d",ans);
}