谜一样的牛

题目链接

题意:有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高。现在这n头奶牛站成一列,已知第i头牛前面有Ai头牛比它低,求每头奶牛的身高。

思路:第k头牛的身高hk为1~n中除掉hk+1,hk+2……hn中第Ak+1小的。所以可以维护一个01序列,当找其中的第ai+1个1,找完后把该位置变0继续找。

#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<queue>
#include<cstdio>
#include<cmath>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
const int N=2e5+10;
ll a[N],c[N],n,m,v[N],b[N];
ll ask(ll x)
{
    ll ans=0;
    for(;x;x-=lowbit(x))
        ans+=c[x];
    return ans;
}
void add(ll x,ll y)
{
    for(;x<=n;x+=lowbit(x))
    {
        c[x]+=y;
    //    printf("x:%lld\n",x);
    }
        
    
}
int main()
{
    scanf("%lld",&n);
    a[1]++;
    for(int i=2;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        a[i]=a[i]+1; 
        add(i,1); 
    }
    add(1,1);
    for(int i=n;i>=1;i--)
    {
        ll l=1,r=n+1;
        while(r-l>=1)
        {
            ll mid=l+r>>1;
            if(ask(mid)>=a[i]) 
                r=mid;
            else
                l=mid+1;
        }
        b[i]=l;
        add(l,-1);
    }
    for(int i=1;i<=n;i++)
    {
        printf("%lld\n",b[i]);
    }
}

 

posted @ 2019-08-13 19:03  Ldler  Views(199)  Comments(0Edit  收藏  举报