MEX maximizing
题意
开始给一个空的数列,然后q次询问,每一次询问都会添加一个数,我们可以对当前的数列的任意非负数进行加减x,然后求出多种方案中未出现的最小非负整数中最大的是哪个。
分析
对添加的数进行对X取模,并进行记录取模后的值a,以及a出现的次数t,对于每次询问答案ans = a+x*t
t和a都是最小的,t是主键,a是次键
代码
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 1e6+10;
typedef pair<int,int> pii;
int cnt[maxn];//cnt[i]:表示取模x后等于i的次数
priority_queue<pii,vector<pii>,greater<pii> > q;
int Q,X,y;
int main(){
cin>>Q>>X;
for(int i = 0;i<X;i++) q.push({0,i});
while(Q--){
scanf("%d",&y);
cnt[y%X]++;
q.push({cnt[y%X],y%X});
while(q.top().first<cnt[q.top().second]) q.pop();//对于已经修改过的记录进行跳过
pii t = q.top();
printf("%d\n",t.first*X+t.second);
}
return 0;
} 
京公网安备 11010502036488号