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 修改数组并查集的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯 修改数组 python (并查集)

[BZOJ 3211]花神游历各国(并查集+树状数组)

可持久化4--可持久化并查集

BZOJ3674可持久化并查集加强版

第四章 高级数据结构

花神游历各国 题解(小清新线段树/树状数组+并查集)