D - MEX maximizing CodeForces - 1294D思维构造

题目地址

题意

给你一个空数组,你可以q次操作查询,每一次操作将一个数放入数组中。并输出数组中没有的最小数。同时有一个x,数组中的任意元素都可以对 + - x 进行任意次操作。

思路:

因为是对x任意次数操作,所以可以想到要是否存在一个数target 这个数 可以通过 数组中的一个数进行对x的几次操作而得来。那么 target % x 这个数 在数组中一定是存在的。 所以我们可以储存每次插入数对x的余数,这个余数对x 操作可以配凑成一些数。现在只要统计余数的个数即可。如果当前的
target 在数组中是没有数 可以 配凑而来的即 a[ 数组中的数 % x] = 0,那么输出这个数即可。

代码

#include<cstdio>
using namespace std;
int a[400005];
int main()
{
    int n, x;
    scanf("%d %d", &n, &x);
     int t = 0;
    while(n--)
    {
        int m;
        scanf("%d", &m);
        a[m % x]++;

        while(a[t % x])
        {
            a[t % x]--;///此前的余数构成的数已经出现。
            t++;
        }
        printf("%d\n", t);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章