POJ - 2182 (树状数组)

博客围绕已知条件求奶牛身高问题展开。已知n头奶牛身高为1到n且各不相同,第i头奶牛前有a[i]头比它矮。最后一头牛身高为a[n]+1,第k头牛身高是特定条件下的数,可通过树状数组加二分查询求解,树状数组初始化为1,找到答案后标记。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

17/100

发布文章

在这里插入图片描述

有n(n <= 105)头奶牛,已知他们身高为1~n且个不相同, 但不知道奶牛的具体身高。现在这n头奶牛站成一列,已知第i头奶牛前面有a[i]头奶牛比他低,求每头奶牛的身高;

对于最后一头牛,显然H[n] = a[n] + 1;

对于第k头牛,他的身高应该是1到n中第ak+1小的没有在hk到hn中出现的数 (不要问我怎么知道的,这是书上写的,我看半天没看懂,tmd自己有花了个图才勉强看出来的) ,,,,

然后就是树状数组加二分查询了

树状数组全部初始化为1,每找到一个答案就标记一下


#pragma G++ optimize(2)

#pragma GCC optimize(2)

#include<iostream>

#include<algorithm>

#include<stack>

#include<vector>

#include<iostream>

#include<climits>

#include<queue>

#include<cassert>

#include<iomanip>

#include<cmath>

#include<bitset>

#include<string> 

#include<cstdio>

#include<cstring>

#define _rep(i, a, b) for(int i = (a); i <=
(b); ++i)

#define _rev(i, a, b) for(int i = (a); i >=
(b); --i)

#define _for(i, a, b) for(int i = (a); i <(b);
++i)

#define maxn 8009

#define maxm 49

#define ll long long

#define met(a,b)
memset((a),(b), sizeof(a))

#define db double

#define eps 1e-8

#define lowbit(x) (x)&(-x)

#define mod 105

using namespace std;

int n, num[maxn], t[maxn], ans[maxn];

void add(int x, int v) {

    for (; x <= n; x += lowbit(x)) t[x] += v;

}

int ask(int i) {

    int ret = 0;

    for (; i; i -= lowbit(i)) ret += t[i];

    return ret;

}

int
binary_(int v) {

    int l = 1, r = n;

    while (l < r)

    {

         int mid = (l + r)
>> 1;

         ask(mid)
< v ? l = mid + 1 : r =
mid;

    }

    return l;

}

int main()
{

    ios::sync_with_stdio(0);

    cin
>> n;

    add(1,
1);

    _rep(i, 2, n) {

         cin
>> num[i];

         add(i,
1);

    }

    _rev(i, n, 1) {

         ans[i]
= binary_(num[i] + 1);//二分寻位

         add(ans[i],
-1);//标记已经出现过了

    }

    _rep(i, 1, n)cout << ans[i] << endl;

 

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值