Marvolo Gaunt’s Ring

题面翻译

给了三个数: $p,q,r(-1e9<=p,q,r<=1e9)$

然后给了n个数$a_1,a_2…a_n(-1e9<=a_i<=1e9)$

求找出三个数$a_i,a_j,a_k(1<=i<=j<=k<=n)$使得$p\times a_i+q\times a_j+r\times a_k$最大。

分析

这是一道十分简单的“三元组”问题,套路很简单:

  • 枚举中心点 $j,\ O(1)$ 找到最大的 $i, j$。
    对于这一道题目,需要处理前缀最大值和后缀最大值即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 5;

int n, p, q, r, ans = LONG_LONG_MIN;

int a[N], mxf[N], mxb[N];

signed main(){

cin >> n >> p >> q >> r;
for (int i = 1; i <= n; i++)
cin >> a[i];

mxb[n + 1] = mxf[0] = -1e18 - 1;

for (int i = 1; i <= n; i++)
mxf[i] = max(mxf[i - 1], a[i] * p);

for (int i = n; i >= 1; i--)
mxb[i] = max(mxb[i + 1], a[i] * r);

for (int i = 1; i <= n; i++)
ans = max(ans, mxf[i] + a[i] * q + mxb[i]);

cout << ans;

return 0;
}

Written with StackEdit中文版.