简略题意:给出
p
,
枚举
aj
,当
0≤p
,选取
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;
}