A. k-Amazing Numbers

https://codeforces.com/problemset/problem/1416/A

题意:给定长度为n的数组a,现有k∈[1, n],求每个k值下,a中的amazing number。如果一个数在a的n - k + 1个连续区间中都出现,那么数值最小的数,就是amazing number。

思路:求出a中的每个数字,可以负责的最大k,那么从k,k+1,...,n都是使用这个数字作为最小值。只要求出每个数字距离最左边,上个数,下个数以及距离最右边距离中的最大一个,就得到了合法的k值。 首先遍历所有的数字,维护last数组和f数组,last代表数字上一次出现的位置,f代表当前数字可以代表的最小合法区间长度。最后,遍历[1, n],按条件更新ans数组即可。

总结:。。好凌乱

inline void solve() {
    int n;
    cin >> n;

    vector<int> a(n + 1);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
    }

    vector<int> f(n + 1, 0);
    vector<int> ans(n + 1, -1);
    vector<int> last(n + 1, 0);

    for (int i = 1; i <= n; ++i) {
        f[a[i]] = max(f[a[i]], i - last[a[i]]);
        last[a[i]] = i;
    }

    for (int i = 1; i <= n; ++i) {
        f[i] = max(f[i], n - last[i] + 1);
    }

    for (int i = 1; i <= n; ++i) {
        int l = f[i];
        while (l <= n && ans[l] == -1) {
            ans[l ++] = i;
        }
    }

    for (int i = 1; i <= n; ++i) {
        cout << ans[i] << " \n"[i == n];
    }
}
posted @ 2025-12-02 10:09  _Yxc  阅读(6)  评论(0)    收藏  举报