这道题的题意不太好理解。
但是理解之后经过推理就能得知是求第i个大的没有出现的数字。
那么就可以这样子,每个位置预处理代表1.然后出现一次这个位置就变为0
每次求从第一位开始算,和为k的数。
尝试了一下线段树,感觉很好理解,以后遇到类似的,求从头开始和为多少的位置就可以参考这个了。
代码:
#include<bits/stdc++.h>
using namespace std;
int lala[50000*4+10];
void build(int id,int l,int r)
{
int m=(l+r)/2;
if(l==r)
{
lala[id]=1;
return ;
}
build(id*2,l,m);
build(id*2+1,m+1,r);
lala[id]=lala[id*2]+lala[id*2+1];
};
void update(int point,int id,int l,int r)
{
if(l==r)
{
lala[id]=0;
return ;
}
int m=(l+r)/2;
if(point<=m)
update(point,id*2,l,m);
else
update(point,id*2+1,m+1,r);
lala[id]=lala[id*2]+lala[id*2+1];
}
int query(int id,int l,int r,int k)
{
int m=(l+r)/2;
if(l==r)
{
return l;
}
if(k>lala[id*2])
return query(id*2+1,m+1,r,k-lala[id*2]);
else
return query(id*2,l,m,k);
}
int main()
{
int T,n,x;
int xpp;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
build(1,1,n);
for(int i=1;i<=n;i++){
scanf("%d",&x);
xpp=query(1,1,n,x+1);
if(i==n)
cout<<xpp<<endl;
else
cout<<xpp<<" ";
update(xpp,1,1,n);
}
}
return 0;
}