减数游戏
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
dstdst喜欢对序列操作。他的好胖友tanaotanao送给他一个序列a1...ana1...an。dstdst进行n−1次操作,每次操作删去序列中任意两个数a,b,并往序列中加入一个数a×b+k。设最后剩下的数为p,tanaotanao想知道p可能的最大值。
注意并不能完全用优先队列 因为当入队时候数的值大于mod那么就会破坏排序
int n,k;
const int mod=1e9+7;
int main(){
cin>>n>>k;
priority_queue<ll,vector<ll>,greater<ll>>pq;
queue<ll> q;
ll mm=-INF;
for(int i=0;i<n;i++){
int x;
cin>>x;
pq.push(x);
mm=max(mm,x);
}
for(int i=2;i<=n;i++){
ll x=pq.top();
pq.pop();
ll y=pq.top();
pq.pop();
ll m=x*y+k;
if(m>=mod){
q.push(x);
q.push(y);
while (!pq.empty()) {
q.push(pq.top());
pq.pop();
}
while (q.size()!=1) {
x=q.front();
q.pop();
y=q.front();
q.pop();
q.push((x*y+k)%mod);
}
cout<<q.front();
return 0;
}
else pq.push(m);
}
cout<<pq.top();
return 0;
// while (pq.size()!=1) {
// ll x=pq.top();
// pq.pop();
// ll y=pq.top();
// pq.pop();
// pq.push((x*y+k)%mod);
// }
// ll x=pq.top();
// cout<<x;
}