2 3 2 1 1 2 3 5 -1 0 -3 -3 0 3 3
Case #1: 20 Case #2: 0
w
#include <iostream> #include <cstdio> #include <cstring> #include <stack> #include <queue> #include <map> #include <set> #include <vector> #include <cmath> #include <algorithm> #include<cmath> #define INF 0x3f3f3f3f using namespace std; struct node { long long data; int num; }arr[5000100],arr1[5000100]; int cmp(node p1,node p2) { return p1.data<p2.data; } int main() { int t,a,b,x,y; int n,m,i,j,k,flag,flag2,nnum=0; scanf("%d",&t); while(t--) { nnum++; scanf("%d%d%d",&n,&a,&b); long long ans=0; for(i=0; i<n; i++) { scanf("%lld",&arr[i].data); arr1[i].data=arr[i].data*arr[i].data; arr[i].num=arr1[i].num=i; } sort(arr,arr+n,cmp); sort(arr1,arr1+n,cmp); if(a>=0&&b>=0) { if(arr1[n-1].num==arr[n-1].num) { ans=max(a*arr1[n-1].data+b*arr[n-2].data,a*arr1[n-2].data+b*arr[n-1].data); } else ans=a*arr1[n-1].data+b*arr[n-1].data; } else if(a>=0&&b<=0) { if(arr1[n-1].num==arr[0].num) { ans=max(a*arr1[n-1].data+b*arr[1].data,a*arr1[n-2].data+b*arr[0].data); } else ans=a*arr1[n-1].data+b*arr[0].data; } else if(a<=0&&b>=0) { if(arr1[0].num==arr[n-1].num) { ans=max(a*arr1[0].data+b*arr[n-2].data,a*arr1[1].data+b*arr[n-1].data); } else ans=a*arr1[0].data+b*arr[n-1].data; } else if(a<=0&&b<=0) { if(arr1[0].num==arr[0].num) { ans=max(a*arr1[0].data+b*arr[1].data,a*arr1[1].data+b*arr[0].data); } else ans=a*arr1[0].data+b*arr[0].data; } printf("Case #%d: %lld\n",nnum,ans); } return 0; }