显示是每次选最小的两个组合,然后一直求max。
这个数据范围可以直接桶排序,然后用两个队列维护最小值。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops") #include<bits/stdc++.h> //#define int long long using namespace std; typedef long long LL; const int N=1e7+10; LL cnt[N],n,m,seed,res,tmp,a[N]; queue<LL> qa,qb; void generate_array() { unsigned x = seed; for (int i = 0; i < n; ++i) { x ^= x << 13; x ^= x >> 17; x ^= x << 5; a[i] = x % m + 1; } } inline LL get(){ if(!qa.size()){tmp=qb.front(); qb.pop(); return tmp;} if(!qb.size()){tmp=qa.front(); qa.pop(); return tmp;} if(qa.front()<qb.front()) tmp=qa.front(),qa.pop(); else tmp=qb.front(),qb.pop(); return tmp; } signed main(){ cin>>n>>m>>seed; generate_array(); for(int i=0;i<n;i++) cnt[a[i]]++; for(int i=1;i<=1e7;i++) for(int j=0;j<cnt[i];j++) qa.push(i); while(qa.size()+qb.size()>1){ LL x=get(),y=get(); res=max(res,max(x*2,y)); qb.push(max(x*2,y)); } cout<<res; return 0; }