蓝桥杯 17. 修改数组

修改数组

原题目链接

题目描述

给定一个长度为 N 的数组 A = [A1, A2, …, AN],数组中可能包含重复的整数。

现在小明要按以下方法将其修改为没有重复整数的数组:

小明会依次修改 A2, A3, …, AN。

当修改 Ai 时,小明会检查 Ai 是否在 A1 ∼ Ai−1 中出现过。

  • 如果出现过,则小明会给 Ai 加上 1;
  • 如果新的 Ai 仍然在之前出现过,小明会持续给 Ai 加 1,直到 Ai 没有在 A1 ∼ Ai−1 中出现过。

当 AN 也经过上述修改之后,数组 A 中将不再有重复的整数。

现在给定初始的数组 A,请你计算出最终的数组 A。


输入描述

  • 第一行包含一个整数 N
  • 第二行包含 N 个整数 A1, A2, …, AN。

其中:

  • 1 ≤ N ≤ 10^5
  • 1 ≤ Ai ≤ 10^6

输出描述

输出 N 个整数,依次是最终的 A1, A2, …, AN。


输入输出样例

输入

5
2 1 1 3 4

输出

2 1 3 4 5

c++代码

#include

using namespace std;

vector<int> mp(1000001);

int myfind(int x) {
    int root = x;
    while(root != mp[root]) root = mp[root];
    int i = x, j;
    while(i != root) j = mp[i], mp[i] = root, i = j;
    return root;
}

int main() {
    int N, a;
    cin >> N;
    for (int i = 1; i <= 1000000; i++) mp[i] = i;
    for (int i = 0; i < N; i++) {
        cin >> a;
        int k = myfind(a);
        cout << k;
        if (i != N - 1) cout << " ";
        mp[k] = k + 1;
    }
    return 0;
}//by wqs

你可能感兴趣的:(蓝桥杯题库,蓝桥杯,算法,职场和发展,深度优先)