244. 谜一样的牛

题意:有n只牛,现在他们按一种顺序排好,现在知道每只牛前面有几只牛比自己低,牛的身高是1-n,现在求每只牛的身高

解题思路:听了y总的课,他讲的是可以用树状数组+二分做,树状数组维护的是前i个比某头牛小的数量总和,初始状态下我们可以把每个高度都维护一下,千万不要跟我一样把tree数组一个一个变成1,那样是不行的,(没有理解树状数组的含义),简便方法就是tr[i]=lowbit(i),然后从后往前枚举,二分查找出第k+1矮的牛,搜索出来删去这头牛的身高,用ans数组存下每头牛的身高就行了。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const   int N=1e5+10;
int tr[N];
int a[N];
int ans[N];  
int n;
int lowbit(int x)
{
   
    return x&-x;
}
void add(int x)
{
   
    for(int i=x;i<=n;i+=lowbit(i))
    tr[i]--;
}
int sum(int x)
{
   
    int res=0;
    for(int i=x;i;i-=lowbit(i))
    res+=tr[i];
    return res;
}
int main()
{
   

    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
   
        cout<<lowbit(i)<<endl;
    }
    for(int i=2;i<=n;i++)
    scanf("%d",&a[i]);
    for(int i=n;i>=1;i--)
    {
   
        int l=1,r=n;
        while(l<r)
        {
   
            int mid=l+r>>1;
            if(a[i]+1<=sum(mid))  r=mid;
            else    l=mid+1;
        }
        add(r);
        ans[i]=r;
    }
    for(int i=1;i<=n;i++)
    cout<<ans[i]<<endl;
    return 0;
}
全部评论

相关推荐

ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务