这题真的狠玄学。
想到一个O(n^2)的的做法,然而肯定是要挂的。
然后我就是mod咯。
把答案插进树状数组维护最大值。要倒着插入避免后面的继承了前面的。
#include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; int n,s[110000]; int lowbit(int x){return x&-x;} void change(int x,int k) { while(x<=n) { s[x]=max(s[x],k); x+=lowbit(x); } } int getsum(int x) { int ret=0; while(x>=1) { ret=max(s[x],ret); x-=lowbit(x); } return ret; } //----------bit------------ int pos[21000][10],plen[21000]; int main() { scanf("%d",&n);n*=5; memset(plen,0,sizeof(plen)); int x; for(int i=1;i<=n;i++) { scanf("%d",&x); pos[x][++plen[x]]=i; } int ans=0; memset(s,0,sizeof(s)); for(int i=1;i<=n;i++) { scanf("%d",&x); for(int j=5;j>=1;j--) { int d=getsum(pos[x][j]-1)+1; ans=max(ans,d); change(pos[x][j],d); } } printf("%d\n",ans); return 0; }