wa4组re4组,真不知道哪里有问题。。。
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <algorithm>
#define L(x) (x<<1)
#define R(x) ((x<<1)+1)
#define mid(x,y) ((x+y)>>1)
using namespace std;
const int MAXN = 1e5, INF = 0x3f3f3f3f;
int N,MNum,A[MAXN+10][5],Num[MAXN*3+10],opt[MAXN+10][5],seg[4][4*MAXN+10];
inline int max3(int a,int b,int c) {
return max(max(a,b),c);
}
inline void insert(int maxv[],int o,int l,int r,int p,int val) {
if(l==r) {maxv[o]=max(maxv[o],val);return;}
if(p<=mid(l,r)) insert(maxv,L(o),l,mid(l,r),p,val);
else insert(maxv,R(o),mid(l,r)+1,r,p,val);
maxv[o]=max(maxv[L(o)],maxv[R(o)]);
}
inline int query(int maxv[],int o,int l,int r,int ql,int qr) {
if(ql<=l && r<=qr) return maxv[o];
int ret=0;
if(ql<=mid(l,r)) ret=max(ret,query(maxv,L(o),l,mid(l,r),ql,qr));
if(qr>=mid(l,r)+1) ret=max(ret,query(maxv,R(o),mid(l,r)+1,r,ql,qr));
return ret;
}
int main() {
scanf("%d",&N);
for(int i=1;i<=N;i++) scanf("%d",&A[i][0]);
for(int i=1;i<=N;i++) scanf("%d",&A[i][1]);
for(int i=1;i<=N;i++) scanf("%d",&A[i][2]);
for(int i=1;i<=N;i++)
for(int j=0;j<3;j++)
Num[++Num[0]]=A[i][j];
sort(Num+1,Num+Num[0]+1);
Num[0]=unique(Num+1,Num+Num[0]+1)-&Num[1];
for(int i=1;i<=N;i++)
for(int j=0;j<3;j++)
A[i][j]=lower_bound(Num+1,Num+Num[0]+1,A[i][j])-&Num[0];
MNum=Num[Num[0]];
opt[1][0]=opt[1][1]=
opt[1][2]=opt[1][3]=1;
insert(seg[0],1,1,MNum,A[1][0],1);
insert(seg[1],1,1,MNum,A[1][1],1);
insert(seg[2],1,1,MNum,A[1][2],1);
insert(seg[3],1,1,MNum,A[1][2],1);
for(int p=2;p<=N;p++) {
//q=0
{
int mx=0;
mx=max(mx,query(seg[0],1,1,MNum,1,A[p][0]));
mx=max(mx,query(seg[1],1,1,MNum,1,A[p][0]));
mx=max(mx,query(seg[2],1,1,MNum,1,A[p][0]));
mx=max(mx,query(seg[3],1,1,MNum,1,A[p][0]));
opt[p][0]=mx+1;
}
//q=1
{
int mx=0;
mx=max(mx,query(seg[0],1,1,MNum,A[p][1],MNum));
mx=max(mx,query(seg[1],1,1,MNum,A[p][1],MNum));
mx=max(mx,query(seg[2],1,1,MNum,A[p][1],MNum));
mx=max(mx,query(seg[3],1,1,MNum,A[p][1],MNum));
opt[p][1]=mx+1;
}
//q=2
{
opt[p][2]=opt[p][3]=1;
opt[p][2]=max(opt[p][2],query(seg[2],1,1,MNum,1,A[p][2])+1);
opt[p][3]=max(opt[p][3],query(seg[3],1,1,MNum,A[p][2],MNum)+1);
opt[p][2]=max(opt[p][2],query(seg[0],1,1,MNum,1,A[p][2])+1);
opt[p][2]=max(opt[p][2],query(seg[1],1,1,MNum,1,A[p][2])+1);
opt[p][3]=max(opt[p][3],query(seg[0],1,1,MNum,A[p][2],MNum)+1);
opt[p][3]=max(opt[p][3],query(seg[1],1,1,MNum,A[p][2],MNum)+1);
}
insert(seg[0],1,1,MNum,A[p][0],opt[p][0]);
insert(seg[1],1,1,MNum,A[p][1],opt[p][1]);
insert(seg[2],1,1,MNum,A[p][2],opt[p][2]);
insert(seg[3],1,1,MNum,A[p][2],opt[p][3]);
}
int Ans=0;
for(int i=1;i<=N;i++)
Ans=max3(Ans,max(opt[i][0],opt[i][1]),max(opt[i][2],opt[i][3])) ;
printf("%d",Ans);
}