AcWing 244. 谜一样的牛---详解
原题链接
简单
作者:
Violet_66
,
2023-08-27 22:56:22
,
所有人可见
,
阅读 99
题意:给定每个牛前面有多少比自己低的牛的数量,然后让我们推出牛的身高序列
- 具体分析详见代码中注释
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=100010;
int n;
int h[N];
int ans[N];
int tr[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int c){
for(int i=x;i<=n;i+=lowbit(i)) tr[i] +=c;
}
int sum(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)) res +=tr[i];
return res;
}
int main(){
scanf("%d",&n);
for(int i=2;i<=n;i++) scanf("%d",&h[i]);
for(int i=1;i<=n;i++) add(i,1);
for(int i=n;i;i--){
int k=h[i]+1;
int l=1,r=n;
while(l<r){
int mid=l+r>>1;
if(sum(mid)>=k) r=mid;
else l=mid+1;
}
ans[i]=r;
add(r,-1);
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
return 0;
}