有 n头奶牛,已知它们的身高为 1∼n 且各不相同,但不知道每头奶牛的具体身高。
现在这 nn 头奶牛站成一列,已知第 i头牛前面有 Ai 头牛比它低,求每头奶牛的身高。
第 1行:输入整数 nn。
第 2..n行:每行输入一个整数 Ai,第 i行表示第 i 头牛前面有Ai 头牛比它低。
(注意:因为第 1 头牛前面没有牛,所以并没有将它列出)
输出包含 n行,每行输出一个整数表示牛的身高。
第 i 行输出第 i 头牛的身高。
1≤n≤105
笔记: 树状数组可以记录sum(x),1~x的前缀和,x前缀和记录身高比x小的牛的数量,和二分结合找sum(x)=k+1。
打卡:https://www.acwing.com/file_system/file/content/whole/index/content/2754779/
int main(){ cin>>n; for(int i=2;i<=n;i++)cin>>h[i]; for(int i=1;i<=n;i++)tr[i]=lowbit(i); for(int i=n;i;i--){ int k=h[i]+1; int l=1,r=n; while(l<r){ int mid=(l+r+1)>>1; if(sum(mid)<k)l=mid; else r=mid-1; } ans[i]=l; add(l,-1); } for(int i=1;i<=n;i++)cout<<ans[i]<<endl; return 0; }