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;
}

  

posted @ 2018-08-03 15:58  蒟蒻JHY  阅读(223)  评论(0编辑  收藏  举报