题目大意:对于每组数据,查询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;
}