一开始忘记康托展开的定义了,看完定义就是水题。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=50000+5;
int c[maxn],a[maxn],s[maxn],vis[maxn];
int n;
int lowbit(int x) {return x&(-x);}
void add(int x,int d)
{
while(x<=n){
c[x]+=d;x+=lowbit(x);
}
}
int sum(int x){
int res=0;
while(x>0){
res+=c[x];x-=lowbit(x);
}
return res;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(c,0,sizeof(c));
memset(a,0,sizeof(a));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=1;i<=n;i++) {scanf("%d",&s[i]);add(i,1);}
for(int i=1;i<=n;i++){
int l=1,r=n;
while(l<=r)
{
int mid=(l+r)/2;
int res=sum(mid);
if(res==s[i]+1){
while(vis[mid]==1) mid--;
if(vis[mid]==0) {vis[mid]=1;add(mid,-1);printf("%s%d",i==1?"":" ",mid);break;}
}
if(res<s[i]+1) l=mid+1;
else r=mid-1;
}
}
printf("\n");
}
}