[CF1805F1] Survival of the Weakest (easy version) 题解
falling_cloud · · 题解
提供一种只能过 easy version 的解法。
对于
但是还有一个问题:
接下来证明为什么这样做之后数列中的元素就不会超过 int 范围:对于一个长度为
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3000 + 5;
const int M = 1e9 + 7;
int a[N],b[N],pw[N];
struct pi
{
int x,y;
bool operator > (const pi &ti) const
{
return a[x]+a[y]>a[ti.x]+a[ti.y];
}
}t;
priority_queue <pi,vector<pi>,greater<pi> > q;
void solve()
{
int n,m,i,j,l,r,x,y,tag=0;
cin>>n; pw[0]=1;
for(i=1;i<=n;i++) pw[i]=pw[i-1]*2%M;
for(i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(i=n;i>=2;i--)
{
while(!q.empty()) q.pop();
for(j=1;j<i;j++)
q.push((pi){j,j+1});
for(j=1;j<i;j++)
{
t=q.top(); q.pop();
b[j]=a[t.x]+a[t.y];
q.push((pi){t.x,t.y+1});
}
tag=(tag+b[1]*pw[i-2])%M;
for(j=i-1;j>=1;j--)
b[j]-=b[1];
for(j=1;j<i;j++)
a[j]=b[j]%M;
}
cout<<(a[1]+tag)%M;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int Ti;
// for(cin>>Ti;Ti;Ti--)
solve();
return 0;
}