//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.2
题意:对于一个数组(1~n的一个排列),已知每个元素有几个逆序数,还原这个数组。
题解:从下标1~n置数,对于下标是i的数,选取当前还未被置数中第a[i]+1大的数。(这样构造,比它小的a[i]个数都会放在它后面)
#include<cstdio>
const int N=505;
int vis[N],ans[N];
int main() {
int n,i,j,x,cnt;
scanf("%d",&n);
for(i=1;i<=n;++i) vis[i]=1;
for(i=1;i<=n;++i) {
scanf("%d",&x);
cnt=x+1;
for(j=1;j<=n;++j) {
if(vis[j]) --cnt;
if(cnt==0) break;
}
ans[i]=j;vis[j]=0;
}
for(i=1;i<=n;++i) printf("%d%c",ans[i],(i==n)?('\n'):(' '));
return 0;
}