思路:分析所有可能的情况,枚举一遍!
#include<cmath>
#include<climits>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int a,b;
pair<int,int> arr[2000010];
bool cmp(pair<int ,int>a,pair<int,int>b)
{
return abs(a.first)<abs(b.first);
}
long long value(int x,int y)
{
return ((long long)a)*x*x+((long long)b)*y;
}
int main()
{
pair<int ,int>brr[4];
int T; scanf("%d",&T);
for(int t=1;t<=T;t++)
{
int n;scanf("%d %d %d",&n,&a,&b);
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i].first);
arr[i].second=i;
}
sort(arr,arr+n,cmp);
brr[0]=arr[0];
brr[1]=arr[1];
brr[2]=arr[n-2];
brr[3]=arr[n-1];
sort(arr,arr+n);
int aindex[4]={0,1,n-2,n-1};
long long ans = LLONG_MIN;
for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
{
if(arr[aindex[i]].second!=arr[aindex[j]].second)
{
ans=max(ans,value(arr[aindex[i]].first,arr[aindex[j]].first));
}
if(arr[aindex[i]].second!=brr[j].second)
{
ans=max(ans,value(arr[aindex[i]].first,brr[j].first));
}
if(brr[i].second!=brr[j].second)
{
ans=max(ans,value(brr[i].first,brr[j].first));
}
if(brr[i].second!=arr[aindex[j]].second)
{
ans=max(ans,value(brr[i].first,arr[aindex[j]].first));
}
}
printf("Case #%d: %lld\n",t,ans);
}
}