题目
思路
这道题比赛时我只会
O
(
n
2
)
O(n^2)
O(n2) 的做法。
但是其实已经非常接近了。
我们对于每个
i
i
i 单独来考虑它对答案的贡献。
当我们把数组排序,那么
i
i
i 就会产生
i
×
2
i
−
1
i\times 2^{i-1}
i×2i−1 的最大贡献(向前);同理,
i
i
i 会产生
i
×
2
n
−
i
i\times 2^{n-i}
i×2n−i 的最小贡献(向后)。
那么
s
u
m
max
−
s
u
m
min
sum_{\max}-sum_{\min}
summax−summin 就是答案。
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
const long long mod=1e9+7;
long long n,a[1000100],f[1000100];
long long maxn,minn;
int main()
{
freopen("sum.in","r",stdin);
freopen("sum.out","w",stdout);
scanf("%lld",&n);
for(int i=1; i<=n; i++)
scanf("%lld",&a[i]);
sort(a+1,a+1+n);
f[0]=1ll;
for(int i=1; i<=n; i++)
f[i]=(f[i-1]*2ll)%mod;
for(int i=1; i<=n; i++)
maxn=(maxn+(a[i]*f[i-1])%mod)%mod,minn=(minn+(a[i]*f[n-i])%mod)%mod;
printf("%lld",(maxn-minn+mod)%mod);
return 0;
}