二分+树状数组水过了,从后往前确定数字即可。
#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 ",ans[i]); } return 0; }