AcWing 244. 谜一样的牛
树状数组+二分,注意题中所引导出的怎么把普通问题转化为树状数组的问题
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e5 + 10;
int n, m;
int tr[N];
int h[N];
int ans[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;
}
signed main()
{
cin>>n;
for(int i = 2; i <= n; i ++ ) cin>>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 ++ ) cout<<ans[i]<<endl;
return 0;
}