题意就不多说了, 题可以转化为排队问题, 我们可以使用树状数组来维护,代码如下:
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 50010; int n; int c[maxn]; int lowbit(int x) { return x&(-x); } int sum(int i) { int s = 0; while(i > 0) { s += c[i]; i -= lowbit(i); } return s; } void add(int i, int val) { while(i <= n) { c[i] += val; i += lowbit(i); } } int a[maxn]; int b[maxn]; int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=1; i<=n; i++) scanf("%d", &b[i]); memset(c, 0, sizeof(c)); for(int i=1; i<=n; i++) add(i, 1); b[0] = 0; for(int i=n; i>=1; i--) { int tmp = b[i] - b[i-1]; tmp = i - tmp; //第tmp大的数 int ans; int l=1, r=n; while(l <= r) { int mid = (l+r)/2; if(sum(mid) >= tmp) { ans = mid; r = mid - 1; } else l = mid + 1; } a[i] = ans; add(a[i], -1); } for(int i=1; i<=n; i++) printf("%d%c", a[i], i==n?' ':' '); } return 0; }