凹函数,三分高度即可
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll e[200005],sum[200005];
ll ans=9223372036854775807,n,a,r,m;
ll f(ll x)
{
ll pos=lower_bound(e+1,e+1+n,x)-e;
ll high=sum[n]-sum[pos-1]-x*(n-pos+1);
ll low=x*(pos-1)-sum[pos-1];
if(a+r<=m)
{
return low*a+high*r;}
else
{
if(high>=low)
{
return low*m+(high-low)*r;}
else
{
return high*m+(low-high)*a;}
}
}
int main()
{
scanf("%lld %lld %lld %lld",&n,&a,&r,&m);
for(int i=1;i<=n;i++)
{
scanf("%lld",&e[i]);}
if(n==1){
printf("0\n");return 0;}
sort(e+1,e+1+n);
for(int i=1;i<=n;i++)
{
sum[i]=sum[i-1]+e[i];
}
ll ans1=f(0),ans2=f(1000000000);
ans=min(ans,ans1);
ans=min(ans,ans2);
ll l=0,r=1000000000,m1,m2;
for(int i=1;i<=1000;i++)
{
ll m1=(l+r)/2;
ll m2=(m1+r)/2;
ans1=f(m1);
ans2=f(m2);
ans=min(ans1,ans);
ans=min(ans2,ans);
if(m1==l&&r==m2)
{
break;}
if(ans1>ans2)
{
l=m1;}
else
{
r=m2;}
}
printf("%lld\n",ans);
return 0;
}