权值线段树找前驱后继

问题是我们要在[L,R]的区间内找第一个在pos前面/后面出现的值。

这个可以转化为在权值线段树上找前驱后继。

前驱问题的具体解决方法是。

如果pos在当前区间的左半边那么答案一定在左区间,于是递归到左区间寻找。

否则优先在右区间进行寻找,如果找到答案的话就返回,否则再在左区间寻找。

复制代码
    int getpre(int l, int r, int o1, int o2, int pos)
    {
        if (!(tr[o2] - tr[o1])) return 0;
        if (l == r) return l;
        int mid = (l + r) >> 1;
        if (pos <= mid) return getpre(l, mid, ls[o1], ls[o2], pos);
        int t = getpre(mid + 1, r, rs[o1], rs[o2], pos);
        if (t) return t; 
        return getpre(l, mid, ls[o1], ls[o2], pos);
    }
复制代码

 

查询后继类似。

复制代码
    int getnxt(int l, int r, int o1, int o2, int pos)
    {
        if (!(tr[o2] - tr[o1])) return 0;
        if (l == r) return l;
        int mid = (l + r) >> 1;
        if (pos > mid) return getnxt(mid + 1, r, rs[o1], rs[o2], pos);
        int t = getnxt(l, mid, ls[o1], ls[o2], pos);
        if (t) return t;
        return getnxt(mid + 1, r, rs[o1], rs[o2], pos);
    }
复制代码

 

posted @   zZhBr  阅读(1028)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示