codeforces 1294 D. MEX maximizing 思维

题目大意:对于每组数据,查询q和可任意加减的数x,对于每次查询,可以向数组中添加一个数,对所有数可进行任意次加减x,问每次查询后,数组中可以不存在的最小非负整数的最大值是多少。

思路:对于每一个插入数组的数字,既然也可以进行任意次加减x,那么说明这个数和其他通过加减x能获得的数是等价的,在数轴上面他们是等距的,是通过加减x可以互相到达的。所以发现可以通过y%x来归纳他们。
然后每一次都记录本次找到的没出现在数组的最优值为ans,在对下次进行查询时直接可以从ans开始向后查找,依据是如果a[ans%x]!=0,说明其他数字是可以通过加减x到达此位置的。如果等于0,说明该位置在现有的数字里面无法通过加减x到达,自然是当前可能最大的情况。(当满足a[ans%x]!=0时,应该消耗一个a[ans%x]用于到达此位置)。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxx = 4e5+10;
ll ans,q,x,y;
ll a[maxx];
int main ()
{
    ios::sync_with_stdio(false);
    cin>>q>>x;
    ans = 0;
    while(q--){
        cin>>y;
        a[y%x]++;
        while(a[ans%x]){
            a[ans%x]--;
            ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

发布了22 篇原创文章 · 获赞 3 · 访问量 515

猜你喜欢

转载自blog.csdn.net/yp0413170331/article/details/104088438