poj 2182 Lost Cows

/*

题意: 有n个数,从1到n,打乱顺序,
现输入n-1个数,第i个数表示序列中第1到i-1的数比第i个数小的个数.要求输出该序列
输入: 5 1 2 1 0
输出: 2 4 5 3 1

*/

#include <iostream> //线段树
using namespace std;
struct node
{
int l,r,num; //num记录[l,r]中还剩余多少人尚未被确定
}tree[40000];
void build(int n,int s,int t)
{
tree[n].l=s;
tree[n].r=t;
tree[n].num=t-s+1;
if(s<t)
{
int mid=(s+t)>>1;
build(2*n,s,mid);
build(2*n+1,mid+1,t);
}
}
int query(int i,int id) //除掉那些已经确定下来的数,现在排在第 id 位的数
{
while( tree[i].l != tree[i].r )
{
tree[i].num--;
if(tree[2*i].num>=id)
i=2*i;
else
{
id-=tree[2*i].num;
i=2*i+1;
}
}
tree[i].num=0; //到达叶子节点
return tree[i].l;
}
int arr[8010],ans[8010];
int main()
{
int n,i;
cin>>n;
build(1,1,n);
for(i=1;i<n;++i) //arr[0]值一直都是 0
cin>>arr[i];
for(i=n-1;i>=0;--i) //从后往前推导
{
ans[i]=query(1,arr[i]+1); //从根结点开始查找
}
for(i=0;i<n;++i)
cout<<ans[i]<<endl;
return 0;
}

posted on 2011-07-18 00:05  sysu_mjc  阅读(188)  评论(0编辑  收藏  举报

导航