二分+树状数组水过了,从后往前确定数字即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string.h>
#include <queue>
#include <cmath>
#include <vector>
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int N=8010;
int num[N],n;
int order[N];
int ans[N];
void update(int x,int w){
for(;x<=n;x+=lowbit(x)) num[x]+=w;
}
int sum(int x){
int s=0;
for(;x;x-=lowbit(x)) s+=num[x];
return s;
}
int find(int s){
int l=0,r=n,m;
int ret;
while(l<=r){
m=(l+r)/2;
if(sum(m)>=s){
ret=m;
r=m-1;
}
else l=m+1;
}
return ret;
}
int main(){
int pos;
while(scanf("%d",&n)!=EOF){
for(int i=1;i<=n;i++)
num[i]=0;
for(int i=1;i<=n;i++)
update(i,1);
for(int i=2;i<=n;i++){
scanf("%d",&order[i]);
}
order[1]=0;
for(int i=n;i>=1;i--){
pos=find(order[i]+1);
ans[i]=pos;
update(pos,-1);
}
for(int i=1;i<=n;i++)
printf("%d\n",ans[i]);
}
return 0;
}