【数据结构】线段树-二分

(以线段树-区间修改为例,假如是单点修改只需要把PushDown去掉)

可以解决形如:

无序数组中第一个大于等于x的值的位置

    pair<int, ll> LowerBound(int u, int l, int r, ll x) {
        pair<int, ll> res = {-1, -LINF};
        if(mx[u] < x)
            return res;
        if(l == r)
            return res = {l, mx[u]};
        PushDown(u, l, r);
        if(mx[ls] >= x) return LowerBound(ls, l, mid, x);
        return LowerBound(rs, mid + 1, r, x);
    }

    pair<int, ll> UpperBound(int u, int l, int r, ll x) {
        pair<int, ll> res = {-1, -LINF};
        if(mx[u] <= x)
            return res;
        if(l == r)
            return res = {l, mx[u]};
        PushDown(u, l, r);
        if(mx[ls] > x) return UpperBound(ls, l, mid, x);
        return UpperBound(rs, mid + 1, r, x);
    }

进入两个分支的条件还可以更加复杂,例如规定必须在某个区间中查找,这个时候要搭配上面的QueryMax来找到半个区间中的最值。

posted @ 2021-02-17 12:48  purinliang  阅读(80)  评论(0编辑  收藏  举报