思考后发现可以贪心,类似哈夫曼树,直接开一个multiset,每次取出最小值和最大值即可。
int n,k;
ll m;
multiset <ll> s;
void solve(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++) {
ll x;cin>>x;
s.insert(x);
}
while(k--){
ll x=*s.begin();
s.erase(s.find(x));
s.insert(x+m);
ll y=*(--s.end());
s.erase(s.find(y));
s.insert(y-m);
}
ll ans=1;
for(auto i:s){
ans=ans*i%mod;
}
cout<<ans<<endl;
}