传送门:洛谷 Harder Problem | Codeforces D. Harder Problem

更佳的阅读体验:CF2044D 题解


简要题意:给定序列 $a$,尝试构造一个序列 $b$,使得 $a$ 中每个元素 $a_i$ 都是 $b$ 中前 $i$ 个数构成的序列的众数(mode),且 $b$ 中每个元素 $b_i$ 都满足 $b_i \in [1, n]$。

由众数的定义,可以想到一个序列中可以有多个众数,所以当 $[1, n]$ 中的每个数都各出现一次时,每个数都是序列 $b$ 的众数。

此时,问题转化为构造一个 $[1, n]$ 的排列。

要保证 $a$ 中每个元素 $a_i$ 都是 $b$ 中前 $i$ 个数构成的序列的众数,只需要在 $a_i$ 第一次出现的位置输出 $a_i$,其余的位置输出任意一个 $a$ 中没有出现过的数即可。

#include <iostream>
#include <bitset>
using namespace std;

const int N = 2e5 + 10;
int t, n, a[N], ans[N];
bitset<N> vis;
basic_string<int> num, inum;

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    for (cin >> t; t; --t) {
        num.clear(), inum.clear(), vis.reset();
        fill(ans + 1, ans + n + 1, 0);
        cin >> n;
        for (int i = 1; i <= n; ++i) cin >> a[i], vis.set(a[i]);
        for (int i = 1; i <= n; ++i) {
            if (vis[i]) num += i;
            else inum += i;
        } vis.reset();
        int pos = 0;
        for (int i = 1; i <= n; ++i) {
            if (!vis[a[i]]) vis.set(a[i]), ans[i] = a[i];
            else ans[i] = inum[pos++];
        } for (int i = 1; i <= n; ++i) cout << ans[i] << " \n"[i == n];
    } return 0;
}
最后修改:2024 年 12 月 22 日
如果觉得我的文章对你有用,请随意赞赏