解析很不错的博客https://blog.csdn.net/m0_38033475/article/details/80372331
二分很好的博客https://blog.csdn.net/csdn_blog_lcl/article/details/78186710
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int C[maxn];
bool flag[maxn];
int ans[maxn];
int a[maxn];
int n;
inline int lowbit(int x){
return x&-x;
}
inline void change(int x){
for(;x<=n;x+=lowbit(x)){
C[x]++;
}
}
inline int getsum(int x){
int res=0;
while(x){
res+=C[x];
x-=lowbit(x);
}
return res;
}
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d",a+i);
}
for(int i=n-1;i;i--){
int l=1,r=n+1,mid;
while(l<r){
mid=l+r>>1;
if(mid>a[i]+1+getsum(mid-1)){
r=mid;
}else if(mid<a[i]+1+getsum(mid-1)){
l=mid+1;
}else{
while(mid<=n&&mid==a[i]+getsum(mid-1)+1){
mid++;
}mid--;
break;
}
}
change(mid);
ans[i]=mid;
flag[mid]=true;
}
for(int i=1;i<=n;i++){
if(!flag[i]){
ans[0]=i;
break;
}
}
for(int i=0;i<n;i++){
printf("%d\n",ans[i]);
}
}