题解:本题主要考查线段树+枚举/线段树二分
简要题意:给定一个序列每个数的逆序数(第一个逆序数个数默认为零,不给出),求原序列
1.线段树+枚举:从后往前遍历序列,每个值表示此牛在剩余的排在第ans+1个,删除此编号,最终得牛在此队列中的编号序列。线段树维护查找
代码如下:
#include<iostream>
using namespace std;
struct N
{
int sum;
}t[846894];
int ans[934221],num[327883];
int n;
void build(int p,int l,int r)
{
t[p].sum=r-l+1;
if(l==r)return ;
int mid=l+r>>1;
build(p*2,l,mid);
build(p*2+1,mid+1,r);
}
int ask(int p,int l,int r,int x)
{
t[p].sum--;
if(l==r)return l;
int mid=l+r>>1;
if(t[p*2].sum>=x)return ask(p*2,l,mid,x);
else return ask(p*2+1,mid+1,r,x-t[p*2].sum);
}
int main()
{
cin>>n;
num[1]=0;
for(int i=2;i<=n;i++)cin>>num[i];
build(1,1,n);
for(int i=n;i>=1;i--)
{
ans[i]=ask(1,1,n,num[i]+1);
}
for(int i=1;i<=n;i++)cout<<ans[i]<<endl;
return 0;
}