题目
排在奶牛前面的奶牛数量实际上比那头奶牛的品牌要小,求奶牛的排序。
分析
二分+树状数组,倒推,二分求出排列,用树状数组求品牌的数量。
代码
#include <cstdio>
using namespace std;
int n,a[8001],c[8001];
void add(int x){while (x<=n) c[x]++,x+=(x&(-x));}
int answ(int x){
int ans=0;
while (x){
ans+=c[x];
x-=(x&(-x));
}
return ans;
}
int ef(int x){
int l=1,r=n;
while (l<r){
int mid=(l+r)>>1;
int t=answ(mid);
if (mid-1-t>=x) r=mid;
else l=mid+1;
}
return l;
}
int main(){
scanf("%d",&n);
for (int i=1;i<n;i++) scanf("%d",&a[i]);
for (int i=n-1;i>=0;i--){
int x=ef(a[i]);
a[i]=x; add(x);
}
for (int i=0;i<n;i++) printf("%d\n",a[i]);
return 0;
}