正题
题目链接:http://poj.org/problem?id=2182
题目大意
给出每头牛前面有多少个比它高的,求每头牛的最大高度。
解题思路
建立一个01序列,表示每个高度是否被占用过,然后倒序扫描每次找到一个没有被占用的第Ai+1个位置,然后标记占用。
我们可以用树状数组表示每个高度前面有多少个没被占用,然后用二分找到答案。
code
#include<cstdio>
#define lobit(x) x&-x
using namespace std;
int c[8001],n,a[8001],ans[8001];
void add(int x,int num)
{while(x<=n){c[x]+=num;x+=lobit(x);}
}
int ask(int x)
{int sum=0;while(x){sum+=c[x];x-=lobit(x);}return sum;
}
int low(int x)//二分答案
{int l=1,r=n;while(l<=r){int mid=(l+r)/2;if(ask(mid)+x<=mid) r=mid-1;else l=mid+1;}return l;
}
int main()
{scanf("%d",&n);a[1]=0;for(int i=2;i<=n;i++)scanf("%d",&a[i]);for(int i=n;i>=1;i--){int w=low(a[i]+1);//找到位置ans[i]=w;//记录答案add(w,1);//占用该位置}for(int i=1;i<=n;i++)printf("%d\n",ans[i]);
}