线段树区间取max区间查询

要线段树资瓷区间max和询问区间和。

设要把$[L, R]$对mx取max。

我们可以在线段树上二分出小于mx的区间然后变成区间修改了。

具体实现是,维护区间最小值和区间最大值,我们递归进入一个区间,如果这个区间的最小值都大于mx的话就不用管这个区间了。

然后我们假设找到了一个区间被$[L, R]$包含,那么如果这个区间的最大值小于mx,就直接修改,否则再递归进入他的子区间进行查找。

void change(int l, int r, int o, int ql, int qr, int c)
{
    if (mn[o] >= c) return ;
    if (l >= ql and r <= qr) 
    {
        if (mx[o] <= c) {
            mx[o] = mn[o] = lzy[o] = c;
            tr[o] = (r - l + 1) * c;
            return ;
        }
    }
    spread(o, l, r);//下放标记
    int mid = (l + r) >> 1;
    if (ql <= mid) change(l, mid, ls, ql, qr, c);
    if (qr > mid) change(mid + 1, r, rs, ql, qr, c);
    pushup(o);
}

 

posted @ 2018-10-28 10:14  zZhBr  阅读(923)  评论(0编辑  收藏  举报