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;
}