思路1(本人思路)
二分 + 树状数组
代码
#include<stdio.h>
int a[100005];
int b[1100005]={0};
bool c[1100005]={false};
int fun2(int x)
{
int res = 0;
while(x>0)
{
res += b[x];
x -= (x&-x);
}
return res;
}
void fun1(int x)
{
while(x<1100004)
{
b[x] += 1;
x += (x&-x);
}
return ;
}
void fun(int idx, int x)
{
if(!c[x])
{
c[x] = true;
fun1(x);
}
else
{
int l=x+1,r=1100004;
int resx = fun2(x);
int t=l;
while(l<=r)
{
int h=(l+r)>>1;
int resh = fun2(h);
if(resh-resx<(h-x))
{
r = h - 1;
}
else
{
t = h + 1;
l = h + 1;
}
}
c[t] = true;
fun1(t);
a[idx] = t;
}
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
fun(i, a[i]);
}
for(i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
return 0;
}
思路2
并查集(目前发现大多数的做法),挺好!
代码(请查看他人做法):
https://blog.csdn.net/starlet_kiss/article/details/105358677