LOST COW
问题描述:一共N头奶牛编号从1到N,现在它们的排列顺序发生了错乱,对于每头奶牛,你只知道排在它前面并且编号小于它的奶牛数量。
输入
第1行:单个整数,N ,表示奶牛的总数
之后N-1行:第k行描述了排在第k+1头奶牛之前并且编号小于该奶牛编号的奶牛数量。当然,没有奶牛排在第一头牛的前面,所以没有考虑它。
样例输入
5
1
2
1
0
样例输出
2
4
5
3
1
#include <iostream>
#include <algorithm>
using namespace std;
struct tree
{
int l, r;
int len; //这个数段里还未被取出的长度
tree* left;
tree* right;
};
void buildtree(tree* root)
{
int l = root->l;
int r = root->r;
if (l == r)
return;
int mid = (l + r) / 2;
root->left = new tree;
root->right = new tree;
root->left->l = l;
root->left->r = mid;
root->right->l = mid + 1;
root->right->r = r;
root->left->len = mid - l + 1;
root->right->len = r - mid;
buildtree(root->left);
buildtree(root->right);
}
int quary(tree* root,int k)
{
root->len--; //搜到哪儿就说明该段要被取出一个数
if (root->l == root->r)
return root->r;
if (root->left->len >= k)
quary(root->left, k);
else
quary(root->right, k - root->left->len);
}
int main()
{
int n;
cin >> n;
int a[8001];
a[1] = 1;
int c[8001] = { 0 };
for (int i = 2; i <= n; i++)
{
cin >> a[i];
a[i]++;
}
tree* root = new tree;
root->l = 1;
root->r = n;
root->len = n;
root->left = new tree;
root->right = new tree;
buildtree(root);
for (int i = n; i >= 1; i--)
{
c[i] = quary(root, a[i]);
}
for (int i = 1; i <= n; i++)
cout << c[i] << endl;
return 0;
}