ABC 272 E - Add and Mex(数学&mex)

ABC 272 E - Add and Mex(数学&mex)

显然 [ 0 , n ] [0,n] [0,n]的数才有意义。

对于 i = 1 i=1 i=1,显然有意义的数最多 n i \dfrac{n}{i} in个。

求和一下最多 n log ⁡ n n\log n nlogn个有意义的数,考虑开 m m m个vector存每轮有意义的数。

然后暴力找即可,因为这些有意的数是不同的,所以暴力最多找一次 O ( n ) O(n) O(n)找满,然后后面都是 O ( 1 ) O(1) O(1)

所以总复杂度; O ( n log ⁡ n ) O(n\log n) O(nlogn)

#include <bits/stdc++.h>
using namespace std;

int main() {
    
    
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    for(auto &v : a) cin >> v;
    vector<vector<int>> vals(m + 1);
    for(int i = 0; i < n; i++) {
    
    
        if(a[i] >= n) continue;
        int l = (a[i] >= 0 ? 1 : (-a[i] + i) / (i + 1));
        int r = min(m + 1, (n - a[i] + i) / (i + 1));
        for(int j = l; j < r; j++) {
    
    
            vals[j].push_back(a[i] + (i + 1) * j);
        }
    }
    for(int i = 1; i <= m; i++) {
    
    
        int sz = vals[i].size();
        vector<bool> exi(sz + 1);
        for(auto v : vals[i]) {
    
    
            if(v < sz) exi[v] = true;
        }
        int res = 0;
        while(exi[res]) res++;
        cout << res << endl;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_45750972/article/details/127985217
Mex