zoukankan      html  css  js  c++  java
  • 线段树区间取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);
    }
  • 相关阅读:
    Scrapy-02-item管道、shell、选择器
    django类视图的装饰器验证
    django禁用csrf
    django admin
    关系型数据库与非关系型数据库
    LINQ.CS
    测试
    测试
    一个测试
    WPF中的Style
  • 原文地址:https://www.cnblogs.com/BriMon/p/9864702.html
Copyright © 2011-2022 走看看