RE了 求dalao帮看下QwQ
查看原帖
RE了 求dalao帮看下QwQ
19600
LittlePrincess楼主2017/10/17 23:49

如题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;
}  

2017/10/17 23:49
加载中...