线性dp,后缀处理——cf1016C好题

Posted zsben991126

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性dp,后缀处理——cf1016C好题相关的知识,希望对你有一定的参考价值。

绝对是好题

#include<bits/stdc++.h>
using namespace std;
#define maxn 300005
#define ll long long 
ll sum1[maxn],sum2[maxn],sum3[maxn],sum[maxn],n,a[maxn][2];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i][0];
    for(int i=1;i<=n;i++)cin>>a[i][1];
    for(int i=1;i<=n;i++){//形状1的长度 
        if(i%2==0){
            sum3[i]=sum3[i-1];
            sum3[i]+=a[i][0]*(2*i-1);
            sum3[i]+=a[i][1]*(2*i-2);
        }
        else {
            sum3[i]=sum3[i-1];
            sum3[i]+=a[i][0]*(2*i-2);
            sum3[i]+=a[i][1]*(2*i-1);
        }
    }
    for(int i=n;i>=1;i--)//求一下后缀 
        sum[i]=sum[i+1]+a[i][0]+a[i][1];
    
    for(int i=n;i>=1;i--){//上面往下绕的权值 
        sum1[i]+=(2*n-1)*a[i][1];//下面的贡献是2*n-1 
        sum1[i]+=2*(i-1)*a[i][0];//下面的贡献是2*(i-1) 
        sum1[i]+=sum1[i+1]-sum[i+1]; 
    }
    for(int i=n;i>=1;i--){//下面往上绕的权值 
        sum2[i]+=2*(i-1)*a[i][1];//下面的贡献是2*(i-1)
        sum2[i]+=(2*n-1)*a[i][0];
        sum2[i]+=sum2[i+1]-sum[i+1]; 
    } 
    ll ans=0;
    for(int i=0;i<=n;i++) {
        if(i%2==0)ans=max(ans,sum3[i]+sum1[i+1]);
        else ans=max(ans,sum3[i]+sum2[i+1]);
    }
    cout<<ans<<endl; 
}

 

以上是关于线性dp,后缀处理——cf1016C好题的主要内容,如果未能解决你的问题,请参考以下文章

换根dp+暴力+预处理+记忆化搜索——cf1292C好题!

cf1272F——经典升维dp,好题!

luogu CF708C Centroids 换根dp好题

dp转图论——cf1070A好题

luogu CF708C Centroids 换根dp好题

cf581F 依赖背包+临时数组 好题