排在奶牛前面的奶牛数量实际上比那头奶牛的品牌要小,求奶牛的排序。
二分+树状数组,倒推,二分求出排列,用树状数组求品牌的数量。
#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; }