数算实习 LOST COW 线段树

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值