洛谷10月月赛R1·浴谷八连测R1·提高组:SAC E#1

来源:互联网 发布:3ds max模型导出优化 编辑:程序博客网 时间:2024/05/16 07:56

这里写图片描述
100 分建八棵树状数组。
维护前面的最大值。。

#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int dp[5][100009],n;int a[5][100009],c[10][400009],t[400009],tot,ans,t1;void up(int k,int x,int v){    for(int i=x;i<=t1;i+=i&(-i))    c[k][i]=max(c[k][i],v); }int ask(int k,int x){    int s=0;    for(int i=x;i>=1;i-=i&(-i))    s=max(c[k][i],s);    return s;}int main(){    scanf("%d",&n);    for(int i=1;i<=3;i++)    for(int j=1;j<=n;j++) scanf("%d",&a[i][j]),t[++tot]=a[i][j];    sort(t+1,t+tot+1);     t1=unique(t+1,t+tot+1)-(t+1);    for(int i=1;i<=3;i++)    for(int j=1;j<=n;j++)    a[i][j]=lower_bound(t+1,t+t1+1,a[i][j])-t;    for(int i=1;i<=n;i++) a[4][i]=a[3][i];    for(int i=1;i<=n;i++)    {            for(int k=1;k<=4;k++)            {                dp[1][i]=max(dp[1][i],ask(k,a[1][i])+1);                    if(k!=4)                dp[3][i]=max(dp[3][i],ask(k,a[3][i])+1);            }            for(int k=5;k<=8;k++)            {                dp[2][i]=max(dp[2][i],ask(k,t1-a[2][i]+1)+1);                if(k!=7)                dp[4][i]=max(dp[4][i],ask(k,t1-a[4][i]+1)+1);            }            for(int j=1;j<=4;j++) {            ans=max(ans,dp[j][i]);            }            for(int k=1;k<=4;k++)                up(k,a[k][i],dp[k][i]);//printf("1");            for(int k=5;k<=8;k++)                up(k,t1-a[k-4][i]+1,dp[k-4][i]);            //for(int j=1;j<=4;j++)ans=max(dp[j][i],ans);    }    printf("%d",ans);}
阅读全文
0 0