LQ0097 修改数组并查集
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0097 修改数组并查集相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2019初赛 C++ A组H题
题目描述
给定一个长度为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(1<=N<=100000)
第二行包含N个整数A1,A2,…,AN(1<=Ai<=1000000)
输出格式
输出N个整数,依次是最终的A1,A2,…,AN
输入样例
5
2 1 1 3 4
输出样例
2 1 3 4 5
问题分析
用并查集来解决,暂时不解释。
AC的C语言程序如下:
/* LQ0097 修改数组 */
#include <stdio.h>
#define N 100000
int a[N + 1], n;
#define M 1000000
int f[M + N + 1];
void Init()
for (int i = 1; i <= M + N; i++)
f[i] = i;
int Find(int a) return a == f[a] ? a : (f[a] = Find(f[a]));
int main()
int n;
scanf("%d", &n);
Init();
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
a[i] = Find(a[i]);
f[a[i]] = Find(a[i] + 1);
for (int i = 1; i <= n; i++)
printf("%d ", a[i]);
return 0;
以上是关于LQ0097 修改数组并查集的主要内容,如果未能解决你的问题,请参考以下文章