/*
从后往前,每个位置(i)的值应该为,
将i后面所有确定好的数插入到数列中,第(A[i]+1)个空位对应的下标。
可以用二分加树状数组。
树状数组处理上述语句的前半段,二分处理后半段,去快速查找那个位置。
*/
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int c[N],n,a[N],ans[N];
bool vis[N];
#define lowbit(x) (x & -x)
void change(int x,int v){
for(int i=x;i<=n;i+=lowbit(i)) c[i] += v;
}
int ask(int x){
int res = 0;
for(int i=x;i;i-=lowbit(i)) res += c[i];
return res;
}
int main(){
cin>>n;
for(int i=2;i<=n;i++) cin>>a[i];
for(int i=n;i>=2;i--){
int l = 1,r = n,k = a[i] + 1;
while(l < r){
int mid = (l + r) >> 1;
if((mid - ask(mid)) >= k) r = mid;
else l = mid + 1;
}
change(r,1);
ans[i] = r;
vis[r] = true;
}
ans[1] = 1;
while(vis[ans[1]]) ans[1] ++;
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
return 0;
}
谜一样的牛(acwing)(树状数组+二分)
最新推荐文章于 2022-03-19 16:59:47 发布