两种解法:
1.直接数组
2.线段树降低时间复杂度
#include <bits/stdc++.h>
using namespace std;
int n;
int pre[10000];
int ans[10000];
// 构建区间为1-n的线段树
struct node {
int l, r;
int len; // 当前节点有多少牛
node() {}
node(int l, int r, int value) : l(l), r(r), len(value) {}
} tree[40000];
// 初始化1-n的线段树
void build_tree(int l, int r, int u) {
if (l > r) return;
tree[u].l = l;
tree[u].r = r;
tree[u].len = r - l + 1;
if (l == r) return; // 到达叶子节点,退出递归
int mid = (l + r) >> 1;
build_tree(l, mid, u << 1);
build_tree(mid + 1, r, (u << 1) + 1);
}
// 查询第 num 小的元素 u 是当前结点
int query(int u, int num) {
tree[u].len--;
if (tree[u].l == tree[u].r) return tree[u].l; // 到达叶子节点
if (tree[u << 1].len < num) {
return query((u << 1) + 1, num - tree[u << 1].len);
} else {
return query(u << 1, num);
}
}
int main() {
cin >> n;
pre[1] = 0;
for (int i = 2; i <= n; i++) {
cin >> pre[i];
}
build_tree(1, n, 1);
for (int i = n; i >= 1; i--) {
ans[i] = query(1, pre[i] + 1);
}
for (int i = 1; i <= n; i++) {
cout << ans[i] << endl;
}
return 0;
}