#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=8005;
int n,a[N],b[N],c[N],h[N],bj[N];
inline int lowbit(int x){return x&-x;}
inline void add(int x,int v){for(;x<=n;x+=lowbit(x))c[x]+=v;}
inline int ask(int x){int cnt=0;for(;x;x-=lowbit(x))cnt+=c[x];return cnt;}
int main(){
n=read();for(int i=2;i<=n;++i)a[i]=read();
for(int i=1;i<=n;++i)b[i]=1,add(i,1);
for(int i=n;i>=2;--i){
int l=1,r=n,ans=0;
while(l<=r){//二分查找到第ai+1个数字为1的位置
int mid=(l+r)>>1;
if(ask(mid)>=a[i]+1)ans=mid,r=mid-1;
else l=mid+1;
}
h[i]=ans;b[ans]=0;add(ans,-1);bj[ans]=1;//更新答案和树状数组
}
for(int i=1;i<=n;++i)if(!bj[i])h[1]=i;//最后剩下的就是第一头牛的身高
for(int i=1;i<=n;++i)printf("%d\n",h[i]);
return 0;
}
原文:https://www.cnblogs.com/PPXppx/p/11688079.html