原题链接:订单编号 - 题目 - Daimayuan Online Judge
解题思路:用一个桶记录这个数字是否有使用过。如果没有,即默认指向0的话,直接输出。如果已被标记,那么利用并查集,查到最靠近该数字的大于其的未标记数字。然后将该未标记数字并入连通块,再将该连通块全部指向未标记数字的后一个,包括未标记数字本身。未标记数字在指向后一个数字本身,就已经标记了它本身。
AC代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000000];
unordered_map<long long,long long> cmp;
long long rua(long long x){//并查集
if(cmp[x]==0){//为0输出
printf("%lld ",x);
cmp[x]=x+1;
return x+1;
}
return cmp[x]=rua(cmp[x]);//不为零则继续递推,并在回归时更新
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
long long buffer;
scanf("%lld",&buffer);
rua(buffer);
}
return 0;
}