#树状数组,二分#poj 2182 Lost Cows

题目

排在奶牛前面的奶牛数量实际上比那头奶牛的品牌要小,求奶牛的排序。


分析

二分+树状数组,倒推,二分求出排列,用树状数组求品牌的数量。


代码

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

猜你喜欢

转载自blog.csdn.net/sugar_free_mint/article/details/80766448