单点修改+查找区间最大值

最大数

#include<bits/stdc++.h>
using namespace std;

const int N = 200010;

int a,t,p,l,m,n;

struct stu
{
    int l,r;
    int v;//根据pushup定义所需的变量
} tr[N * 4];

void pushup(int u)//用两个子结点更新父节点
{
    tr[u].v = max(tr[u * 2].v,tr[u * 2 + 1].v);
}

void build(int u,int l,int r)
{
    tr[u] = {l,r};//不能忘
    if(l == r)//可输入值
        return ;

    int mid = (l + r) / 2;//唯一的l+r

    build(u * 2,l,mid);//递归建树
    build(u * 2 + 1,mid + 1,r);
}

int query(int u,int l,int r)
{
    if(tr[u].l >= l && tr[u].r <= r)//都在查询范围内
        return tr[u].v;

    int v = 0,mid = (tr[u].l + tr[u].r) / 2;

    if(l <= mid)//一定与左边有交集
        v = query(u * 2,l,r);
    if(r > mid)//右边
        v = max(v,query(u * 2 + 1,l,r));

    return v;
}

void modify(int u,int x,int v)
{
    if(tr[u].l == x && tr[u].r == x)
        tr[u].v = v;//修改
    else
    {
        int mid = (tr[u].l + tr[u].r) / 2;

        if(x <= mid)
            modify(u * 2,x,v);
        else
            modify(u * 2 + 1,x,v);
            
        pushup(u);//不要忘了修改完了重新pushup,放else因为修改的点没有子结点
    }
}

int main()
{
    cin>>m>>p;
    char op;
    build(1,1,m);
    while(m -- )
    {
        cin>>op>>l;
        if(op == 'Q')
        {
            a = query(1,n - l + 1,n);//查找末尾l位
            cout<<a<<endl;
        }
        else
        {
            n ++;
            modify(1,n,(l + a) % p);
        }
    }

    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 Python 实现线段树查找区间最大值的代码: ```python class SegmentTree: def __init__(self, nums): self.n = len(nums) self.tree = [0] * (self.n * 4) self.build_tree(nums, 0, 0, self.n - 1) def build_tree(self, nums, i, l, r): if l == r: self.tree[i] = nums[l] else: mid = (l + r) // 2 self.build_tree(nums, i * 2 + 1, l, mid) self.build_tree(nums, i * 2 + 2, mid + 1, r) self.tree[i] = max(self.tree[i * 2 + 1], self.tree[i * 2 + 2]) def query(self, i, l, r, ql, qr): if ql <= l and qr >= r: return self.tree[i] elif ql > r or qr < l: return float('-inf') else: mid = (l + r) // 2 left = self.query(i * 2 + 1, l, mid, ql, qr) right = self.query(i * 2 + 2, mid + 1, r, ql, qr) return max(left, right) ``` 其中,SegmentTree 类的构造函数中,build_tree 方法用于构建线段树;query 方法用于查询区间内的最大值。具体实现如下: 1. build_tree 方法中,i 是当前节点的下标,l 和 r 分别是当前节点所代表的区间的左端点和右端点。如果区间只有一个元素,则将当前节点的值设为该元素的值;否则,递归构建左右子树,并将当前节点的值设为左右子树中的最大值。 2. query 方法中,i、l 和 r 的含义同上,ql 和 qr 分别是查询区间的左端点和右端点。如果当前节点所代表的区间完全包含在查询区间内,则返回当前节点的值;如果当前节点所代表的区间完全不在查询区间内,则返回负无穷;否则,递归查询左右子树,并返回左右子树中的最大值。 使用示例: ```python nums = [1, 3, 2, 7, 9, 11] st = SegmentTree(nums) print(st.query(0, 0, st.n - 1, 1, 4)) # 输出:7 ``` 其中,nums 是待构建线段树的列表,st 是构建的线段树对象,st.query(0, 0, st.n - 1, 1, 4) 表示查询 nums[1:5] 区间内的最大值,结果为 7。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值