poj2182 Lost Cow

该博客介绍了如何解决poj2182 Lost Cow问题,通过利用数列的性质,可以找到第a[i]+1小的数。博主建议使用树状数组或线段树来存储已删除的数,并用区间长度减去区间记录的数字来获取剩余数的个数。由于问题的单调性,二分查找可以进行优化。博主提醒注意初始化变量和二分查找的细节处理。
摘要由CSDN通过智能技术生成

根据题目给出的数列的性质,每次可以求出最后一头牛的编号

也就是在当前有的数列1  2  3 ....   n 中找到第a[i]+1小的数

可以用树状数组或者线段树,记录的是已经删除了的数的个数

还有的数的个数为     区间长度-区间记录的数字

这个是单调的(不严格),所以可以用二分查找优化

然后更新一下就可以了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
int n,k,a[8010],c[8010];
int lowbit(int x)
{
    return x & (-x);
}
void updata(int x)
{
    while (x<=n)
    {
        c[x]+=1;
        x+=lowbit(x);
    }
}
int ask(int x)
{
    int s=0;//一定要初始化为0
    while (x>0)
    {
        s+=c[x];
        x-=lowbit(x);
    }
    return s;
}
int find(int x)
{
    int l=1,r=n,mid,num;
    while (l<r)
    {
        mid=(l + r) >> 1;//!!
        num=ask(mid);
        if (mid-num < x) l=mid+1; else r=mid;
    }
    return l;
}
int main()
{
    scanf("%d",
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值