E Add and Mex(调和级数 暴力)题意:
给出一个长度为n\(\le 1e5\)的数组a,每秒对数组中的数加上其下标,例如\(a_i\)在第一秒为\(a_i+i\),第二秒为\(a_i+2i\)。请输出前m\(\le 1e5\)秒中每一秒的最小的非负整数。
思路:
因为只有n个数,那么这个最小非负整数一定小于\(1e5\)。那么当\(a_i\)大于1e5的时候就没有用了,这点很重要。那么我们直接去暴力枚举,把结果存在\(vector flag[秒数]\)中,这个复杂度是调和级数也就是\(O(nlogn)\)的,轻松可以跑过。但是要注意的是,很可能会出现全是-1e9的极端情况,那你枚举的秒数的起点就需要对于这一点作出特判,详情看代码。
实现:
const int N = 200005;int n, m;int a[N];vector flag[N];int main(){ cin >> n >> m; for (int i = 1; i > a[i]; for (int i = 1; i n) continue; int st; if(a[i] < 0) st = (abs(a[i]) / i); else st = 1; for(int j = st; j <= m; j ++) { if(a[i] + j * i n) break; flag[j].push_back(a[i] + j * i); } } for (int i = 1; i <= m; i++) { vector vis(N, 0); for(auto x : flag[i]) if(x < N) vis[x] = 1; int res = 0; while(vis[res]) res ++; cout << res << '\n'; }}