蓝桥杯 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<bits/stdc++.h>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