2019-H(修改数组)

注意:并查集的练习,注意保证有序递增,同时注意添加一个时,看看是否能将前后两部分集合连接

#include <bits/stdc++.h>
using namespace std;

#define MAXN 100005
#define MAXA 1100005
int a,N,fa[MAXN],vis[MAXN];
int get_father(int x){
    if(x ==fa[x]) return x;
    return fa[x] = get_father(fa[x]);
}
int main(){
    ios::sync_with_stdio(false),cin.tie(NULL),cout.tie(NULL);
    cin >> N;
    for(int i=1;i<MAXN;i++){
        fa[i] = i;
    }
    for(int i=0;i<N;i++){
        cin>>a;
        int ans = vis[a] ? get_father(a)+1:a;
        cout<<ans<<' ';
        vis[ans] = 1;
        if(ans != 1&&vis[ans -1])
            fa[ans-1] = ans;//保证并查集的根是最大的,成递增
        if(vis[ans+1])
            fa[ans]  = ans+1;//和后面连接上 
    }
    return 0;
} 

 

posted @ 2021-03-05 16:23  zmachine  阅读(82)  评论(0编辑  收藏  举报