Codeforces 1294D MEX maximizing

题目链接:

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 << '\n';
	}
	return 0;
}
posted @ 2020-01-23 17:04  YuhanのBlog  阅读(114)  评论(0编辑  收藏  举报