如题QAQ
#include<bits/stdc++.h>
using namespace std;
#define lb(x) x&-x
#define MN 100010
int n,c1[MN*4],c2[4*MN],rk[6][MN],tot,dp[6][MN],b[6][MN],ans,T;
struct lll{
int x,pos1,pos2;
}a[4*MN];
int gax1(int pos)
{int ans=0;for(;pos;pos-=lb(pos)) if(c1[pos]>ans) ans=c1[pos];return ans;}
int gax2(int pos)
{int ans=0;for(;pos;pos-=lb(pos)) if(c2[pos]>ans) ans=c2[pos];return ans;}
void addd(int pos,int x)
{for(int i=pos;i<=tot;i+=lb(i))
if(x>c1[i]) c1[i]=x;}
void ad(int pos,int x)
{for(int i=pos;i<=tot;i+=lb(i))
if(x>c2[i]) c2[i]=x;}
bool cmp(lll a,lll b)
{return a.x<b.x;}
int main()
{
cin>>n;for(int i=1;i<=3;i++) for(int j=1;j<=n;j++) cin>>b[i][j],a[++T].pos1=i,a[T].pos2=j,a[T].x=b[i][j];
sort(a+1,a+1+T,cmp);
for(int i=1;i<=T;i++)
if(a[i].x!=a[i-1].x) rk[a[i].pos1][a[i].pos2]=++tot;else rk[a[i].pos1][a[i].pos2]=tot;
/*for(int i=1;i<=3;i++){
for(int j=1;j<=n;j++) cout<<rk[i][j]<<" ";cout<<endl;
} */
for(int i=1;i<=3;i++) dp[1][i]=1;
for(int i=1;i<=n;i++)
{
dp[i][1]=max(dp[i][1],gax1(rk[1][i])+1);
dp[i][2]=max(dp[i][2],gax2(tot-rk[2][i]+1)+1);
dp[i][3]=max(dp[i][3],dp[i-1][1]+1);
dp[i][3]=max(dp[i][3],dp[i-1][2]+1);
if(rk[i][3]>=rk[i-1][3]) dp[i][3]=max(dp[i][3],dp[i-1][3]+1);
dp[i][4]=max(dp[i][3],dp[i-1][1]+1);
dp[i][4]=max(dp[i][3],dp[i-1][2]+1);
if(rk[i][4]<=rk[i-1][4])dp[i][4]=max(dp[i][3],dp[i-1][4]+1);
for(int k=1;k<=3;k++)
addd(rk[k][i],dp[i][k]),ad(tot-rk[k][i]+1,dp[i][k]);
}
for(int i=1;i<=4;i++) ans=max(ans,dp[n][i]);
cout<<ans;
}