HihoCoder - 1756 打怪
拆成两个部分分别算显然比较简单。
前面一个部分排个序枚举最大值算就好啦。
后面的就相当于把每一种数值的贡献加起来,也可以在排完序之后的a[]上面直接算出来。
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+5,ha=1e9+7; inline int add(int x,int y){ x+=y; return x>=ha?x-ha:x;} inline void ADD(int &x,int y){ x+=y; if(x>=ha) x-=ha;} int n,a[N],ans,c[N]; inline void calc(){ for(int i=1;i<=n;i++) ADD(ans,a[i]*(ll)c[i-1]%ha); for(int i=1,now=0;i<=n;i++){ now++; if(a[i]!=a[i+1]) ADD(ans,add(ha-c[n],c[n-now])),now=0; } } int main(){ scanf("%d",&n); c[0]=1; for(int i=1;i<=n;i++) c[i]=add(c[i-1],c[i-1]); for(int i=1;i<=n;i++) scanf("%d",a+i); sort(a+1,a+n+1); calc(); printf("%d\n",ans); return 0; }
我爱学习,学习使我快乐