codeforces 855B DP

简略题意:给出 p q r ,给出n个数 v[i] ,问 ijk,max(pai+qaj+rak)

枚举 aj ,当 0p ,选取 max(ai),i[1,j] , 否则选取 min(ai),i[1,j]
q <script type="math/tex" id="MathJax-Element-1677">q</script>同理。对于取max和取min,维护前缀和后缀即可。

不过因为答案可能超过了1e18…这就成了本场的hack点。

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const LL maxn = 110000;

LL n;
LL p, q, r;
LL v[maxn];
LL pma[maxn], pmi[maxn];
LL sma[maxn], smi[maxn];

int main() {
    scanf("%lld", &n);
    scanf("%lld%lld%lld", &p, &q, &r);
    pma[0] = -1e18; pmi[0] = 1e18;
    sma[n+1] = -1e18; smi[n+1] = 1e18;
    for(LL i = 1; i <= n; i++)
        scanf("%lld", &v[i]);
    for(LL i = 1; i <= n; i++) {
        pma[i] = max(pma[i-1], v[i]);
        pmi[i] = min(pmi[i-1], v[i]);
    }
    for(LL i = n; i >= 1; i--) {
        sma[i] = max(sma[i+1], v[i]);
        smi[i] = min(smi[i+1], v[i]);
    }
    LL ans = -4e18;
    for(int i = 1; i <= n; i++) {
        LL tmp = 0;
        if(p >= 0)
            tmp += p * pma[i];
        if(r >= 0)
            tmp += r*sma[i];
        if(p < 0)
            tmp += p * pmi[i];
        if(r < 0)
            tmp += r * smi[i];
        ans = max(ans, tmp + v[i]*q);
    }
    cout<<ans<<endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值