P8686 [蓝桥杯 2019 省 A] 修改数组
题目描述
给定一个长度为 NNN 的数组 A=[A1,A2,⋯AN]A=[A_1,A_2, \cdots A_N]A=[A1,A2,⋯AN],数组中有可能有重复出现的整数。
现在小明要按以下方法将其修改为没有重复整数的数组。小明会依次修改 A2,A3,⋯ ,ANA_2,A_3, \cdots ,A_NA2,A3,⋯,AN。
当修改 AiA_iAi 时,小明会检查 AiA_iAi 是否在 A1A_1A1 ∼ Ai−1A_{i-1}Ai−1 中出现过。如果出现过,则小明会给 AiA_iAi 加上 111;如果新的 AiA_iAi 仍在之前出现过,小明会持续给 AiA_iAi 加 111,直到 AiA_iAi 没有在 A1A_1A1 ∼ Ai−1A_{i-1}Ai−1 中出现过。
当 ANA_NAN 也经过上述修改之后,显然 AAA 数组中就没有重复的整数了。
现在给定初始的 AAA 数组,请你计算出最终的 AAA 数组。
输入格式
第一行包含一个整数 NNN。
第二行包含 NNN 个整数 A1,A2,⋯ ,ANA_1,A_2, \cdots ,A_NA1,A2,⋯,AN。
输出格式
输出 NNN 个整数,依次是最终的 A1,A2,⋯ ,ANA_1,A_2, \cdots ,A_NA1,A2,⋯,AN。
输入输出样例 #1
输入 #1
5
2 1 1 3 4
输出 #1
2 1 3 4 5
说明/提示
对于 80%80\%80% 的评测用例,1≤N≤100001 \le N \le 100001≤N≤10000。
对于所有评测用例,1≤N≤1051 \le N \le 10^51≤N≤105,1≤Ai≤1061 \le A_i \le 10^61≤Ai≤106。
蓝桥杯 2019 年省赛 A 组 H 题。
题解
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5+3;
int n, f[N], a;
int find(int x){
if(f[x] == x) return x;
return f[x] = find(f[x]);
}
int main(){
cin>>n;
for(int i=1;i<=100000;++i) f[i] = i;
for(int i=1;i<=n;++i) {
cin>>a;
a = find(a);//如果前面没有一样的数, 那a的值应该不变
f[a] = a+1;//改值,这个数出现过了
cout<<a<<" ";
}
}
1418

被折叠的 条评论
为什么被折叠?



