xt 1149 线段树版的约瑟夫

博客作者在比赛中因小错误遗憾错失一等奖,提到自己在现场的状态不佳。分享了一位高手采用线段树解决约瑟夫问题的方法,但表示难以理解。
摘要由CSDN通过智能技术生成

刺瞎了双眼啊,少了个LL,直接与一等奖失之交臂,二等里的第一,实在是一个悲伤的结局

归根结底,现场的状态弱爆了,这点放平常应该发现的


/**竟然WA在中间结果可能超32位上,害了我两天白费了
*/
#include <stdio.h>

#define L(i) (i)<<1
#define R(i) (i)<<1|1
#define N 100001

struct node
{
    int l,r,sum;
}st[N<<2];

void build(int l,int r,int id)
{
    st[id].l = l;
    st[id].r = r;
    st[id].sum = r - l + 1;
    if(l < r)
    {
        int mid = (l + r) / 2;
        build(l,mid,L(id));
        build(mid + 1,r,R(id));
    }
}

int update(int p,int id)
{
    st[id].sum --;
    if(st[id].l == st[id].r)
        return st[id].l;
    return st[L(id)].sum >= p? update(p,L(id)) : update(p - st[L(id)]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值