给我们一个数组 a, a [i] 表示在 1~i 之间有 ai 头牛比他低。一直每头牛的身高各不相同,切实 1~n 之间的一个数字。
思路
从后往前考虑,如果当前有 k 头牛比自己低,那么我们就在剩余的数字里找第 k+1 小的数字是那个,然后把这个数组删掉,然后继续考虑前一个位置。
代码
#include<bits/stdc++.h>
using namespace std;constint N =1e5+10;int n;int h[N], c[N], ans[N];intlowbit(int x){
return x &-x;}voidadd(int x,int y){
while(x <= n){
c[x]+= y;
x +=lowbit(x);}}intsum(int x){
int res =0;while(x >0){
res += c[x];
x -=lowbit(x);}return res;}intmain(){
scanf("%d",&n);for(int i =2; i <= n; i ++)scanf("%d",&h[i]);for(int i =1; i <= n; i ++) c[i]=lowbit(i);for(int i = n; i >=1; i --){
int k = h[i]+1;int l =1, r = n, id;while(l <= r){
int md =(l + r)>>1;if(sum(md)>= k){
id = md;
r = md -1;}else
l = md +1;}
ans[i]= id;add(id,-1);}for(int i =1; i <= n; i ++)printf("%d\n", ans[i]);return0;}