原题地址:https://ac.nowcoder.com/acm/contest/1080/B
千万别被题面影响到 直接模拟直接T
其实就是找位置 如果该位置有数字了 就继续往下找 那么怎么优化呢 我们可以再找到空位置的时候 把过程中经过的却不是空位的位置直接指向这个空位置。等等 这不就是并查集吗
把有数字的位置的父节点接到他后面的空位置
那么代码就显而易见了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int v[1000005];
int f[1000010];
int find(int x)
{
int t=x;
while(f[x]!=x)
x=f[x];
while(x!=t)
{
int tt=f[t];
f[t]=x;
t=tt;
}
return x;
}
int main()
{
int n;
cin>>n;
for(int i=0; i<=n+5; i++)
f[i]=i;
for(int i=1,x; i<=n; i++)
{
scanf("%d",&x);
int has=x%n;
int q=find(has);
v[q]=x;
if(q==n-1) f[q]=0;
else f[q]++;
}
for(int i=0; i<n; i++)
cout<<v[i]<<" ";
return 0;
}