acwing244. 谜一样的牛(思维+树状数组)

题意

  1. 给我们一个数组 a, a [i] 表示在 1~i 之间有 ai 头牛比他低。一直每头牛的身高各不相同,切实 1~n 之间的一个数字。

思路

  1. 从后往前考虑,如果当前有 k 头牛比自己低,那么我们就在剩余的数字里找第 k+1 小的数字是那个,然后把这个数组删掉,然后继续考虑前一个位置。

代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int n;
int h[N], c[N], ans[N];

int lowbit(int x) {
    
     return x & -x; }
void add(int x, int y)
{
    
    
    while (x <= n)
    {
    
    
        c[x] += y;
        x += lowbit(x);
    }
}
int sum(int x)
{
    
    
    int res = 0;
    while (x > 0)
    {
    
    
        res += c[x];
        x -= lowbit(x);
    }
    return res;
}


int main()
{
    
    
    scanf("%d", &n);
    for (int i = 2; i <= n; i ++) scanf("%d", &h[i]);
    for (int i = 1; i <= n; i ++) c[i] = lowbit(i);

    for (int i = n; i >= 1; i --) {
    
    
        int k = h[i] + 1;
        int l = 1, r = n, id;
        while (l <= r)
        {
    
    
            int md = (l + r) >> 1;
            if (sum(md) >= k)
            {
    
    
                id = md;
                r = md - 1;
            }
            else
                l = md + 1;
        }
        ans[i] = id;
        add(id, -1);
    }

    for (int i = 1; i <= n; i ++) printf("%d\n", ans[i]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_34261446/article/details/121145075