题目链接:
Codeforces 1294D MEX maximizing
思路:
1.我们需要一个数组记录当前数的分布情况,同时维护一个变量now
表示当前的答案;
2.当给出一个y
时,我们需要计算使得cnt * x + y >= now
的最小cnt
,此时计算出来的cnt * x + y
就是新的y
,并将此位置的值加上1
;
3.当now
所在的位置值大于0时,now
就可以往后移动,而当前的值只需留一个下来,剩下的都加到now + x
上即可;
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5 + 5;
int q, x, now;
int mp[maxn];
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
ios::sync_with_stdio(false);
cin.tie(0);
cin >> q >> x;
for(int i = 0; i < q; ++i) {
int y;
cin >> y;
int cnt = ceil(1.0 * (now - y) / x);
y = y + cnt * x;
if(y < q + 5) ++mp[y];
while(mp[now]) {
if(now + x < q + 5) mp[now + x] = mp[now] - 1, mp[now] = 1;
++now;
}
cout << now << '
';
}
return 0;
}