原题地址: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;
}