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; }