AcWing 1275. 最大数(线段树)

题目描述

题目链接

题目思路

  • 维护当前结点的最大值
  • 向序列后添加一个数,相当于将最后一个数修改为某数
  • 询问这个序列中最后L个数中最大的数是多少,相当于求两个子结点的最大值

题目代码

#include
#include
#include
#include

using namespace std;

typedef long long LL;

const int N = 200010;

int m, p;
struct Node
{
    int l, r;
    int v;  // 区间[l, r]中的最大值
}tr[N * 4];

void pushup(int u)  // 由子节点的信息,来计算父节点的信息
{
    tr[u].v = max(tr[u << 1].v, tr[u << 1 | 1].v);
}

void build(int u, int l, int r)
{
    tr[u] = {l, r};
    if(l == r) return;
    int mid = l + r >> 1;
    build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
}

int query(int u, int l, int r)
{
    if(tr[u].l >= l && tr[u].r > 1;
    int v = 0;
    if (l  mid) v = max(v, query(u << 1 | 1, l, r));

    return v;
}

void modify(int u, int x, int v)  // 将x对应结点最大值改为v
{
    if(tr[u].l == x && tr[u].r == x) tr[u].v = v;
    else
    {
        int mid = tr[u].l + tr[u].r >> 1;
        if(x

Original: https://www.cnblogs.com/esico/p/16534757.html
Author: esico
Title: AcWing 1275. 最大数(线段树)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619895/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球