Largest Point
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1450 Accepted Submission(s): 579
Problem Description
Given the sequence
A with
n integers
t1,t2,⋯,tn. Given the integral coefficients
a and
b. The fact that select two elements
ti and
tj of
A and
i≠j to maximize the value of
at2i+btj, becomes the largest point.
Input
An positive integer
T, indicating there are
T test cases.
For each test case, the first line contains three integers corresponding to n (2≤n≤5×106), a (0≤|a|≤106) and b (0≤|b|≤106). The second line contains nintegers t1,t2,⋯,tn where 0≤|ti|≤106 for 1≤i≤n.
The sum of n for all cases would not be larger than 5×106.
For each test case, the first line contains three integers corresponding to n (2≤n≤5×106), a (0≤|a|≤106) and b (0≤|b|≤106). The second line contains nintegers t1,t2,⋯,tn where 0≤|ti|≤106 for 1≤i≤n.
The sum of n for all cases would not be larger than 5×106.
Output
The output contains exactly
T lines.
For each test case, you should output the maximum value of at2i+btj.
For each test case, you should output the maximum value of at2i+btj.
Sample Input
2 3 2 1 1 2 3 5 -1 0 -3 -3 0 3 3
Sample Output
Case #1: 20 Case #2: 0
solution:
求a*ti^2+b*tj 且i!=j 直接暴力即可 记录前者和后者最大和次大 用map统计一下最大出现的次数 然后瞎搞即可
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
int n;
ll a, b,x,y,z;
int main()
{
int t,cnt=1;
scanf("%d", &t);
while (t--)
{
scanf("%d%I64d%I64d", &n, &a, &b);
ll max1 = -1e18, max2 = -1e18 - 1, max3 = -1e18, max4 = -1e18 - 1;
int pos1, pos3;
map<long long, int>q;
for (int i = 0; i < n; i++)
{
scanf("%I64d", &x);
y = a*x*x; z = b*x;
if (y > max1)
{
max2 = max1;
max1 = y; pos1 = i;
q[max1]++;
}
else if (y > max2)
{
max2 = y;
}
if (z > max3)
{
max4 = max3;
max3 = z; pos3 = i;
q[max3]++;
}
else if (z > max4)
{
max4 = z;
}
}
printf("Case #%d: ", cnt++);
if (pos1 != pos3 || q[max1] > 1||q[max3]>1)printf("%I64d\n", max1 + max3);
else printf("%I64d\n", max(max1 + max4, max2 + max3));
}
return 0;
}