您的位置:首页 > 产品设计 > UI/UE

洛谷10月月赛R1·浴谷八连测R1·提高组:SAC E#1 - 一道简单题 Sequence2

2017-10-15 17:05 393 查看


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++)
{

dea9
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: