题解:
从后往前依次判断牛的高度,当前牛之前有a个牛比它低,则当前牛的最低身高为a+1,所以当前牛的高度为所有牛的第a+1低,然后二分判断当前所有牛中第a+1,低的牛身高为多少,当前每头牛被选走之后,记录一下。
用树状数组维护牛身高的序列,前缀和求第几高,当牛被选走之后,该身高位置减一即可。
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N=1e5+50;
int c[N],a[N],ans[N];
int n;
void add(int x,int y){
while(x<=n){
c[x]+=y;
x+=x&-x;
}
}
int ask(int x){
int ans=0;
while(x){
ans+=c[x];
x-=x&-x;
}
return ans;
}
int main(){
scanf("%d",&n);
add(1,1);
for(int i=2;i<=n;++i){
scanf("%d",&a[i]);
add(i,1);
}
for(int i=n;i>0;--i){
int l=0,r=n;
while(l<r){
int mid=(l+r)/2;
if(ask(mid)<=a[i]){
l=mid+1;
}else{
r=mid;
}
}
ans[i]=l;
add(l,-1);
}
for(int i=1;i<=n;++i){
printf("%d\n",ans[i]);
}
return 0;
}
盗版书上的题解和正版书差了一个字,导致我很长时间都没看懂题解。
过几天看懂另一种题解之后再补一下吧(如果记得话)。