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

匿名 (未验证) 提交于 2019-12-03 00:32:02

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


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


#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; }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!