灵异事件
  • 板块题目总版
  • 楼主lzy20091001
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/8/5 20:45
  • 上次更新2024/8/5 21:31:12
查看原帖
灵异事件
932039
lzy20091001楼主2024/8/5 20:45

给定一棵 nn 个结点的树,点有点权。有 mm 次操作:

  • 1 x 查询 xx 的子树内点权最大的点的编号。输出这个编号并将这个点的点权设为 00。
  • 2 x y 将 xx 的点权加 yy。

数据范围:n,m≤2×105n, m \le 2 \times 10 ^ 5。

思路很简单,求出 DFS 序,直接线段树维护。

但是我的线段树 query() 出锅了。我把标程的其他部分基本上都改成了自己的,所以问题大概率就是 query()。只是两份代码的 query() 我完全看不出来区别,求助。

我的 query():

int query(int u, int l, int r)
{
    if (l <= arr[u].l && arr[u].r <= r)
        return arr[u].w;
    else
    {
        int mid = (arr[u].l + arr[u].r) / 2, res = 0;
        if (l <= mid)
            res = Max(res, query(2 * u, l, r));
        if (r > mid)
            res = Max(res, query(2 * u + 1, l, r));
        return res;
    }
}

标程的 query()

int query(int p, int x, int y)
{
    if (arr[p].l == x && arr[p].r == y)
        return arr[p].w;
    else
    {
        int mid = (arr[p].l + arr[p].r) / 2;
        if (mid < x)
            return query(2 * p + 1, x, y);
        else if (mid >= y)
            return query(2 * p, x, y);
        else
            return Max(query(2 * p, x, mid), query(2 * p + 1, mid + 1, y));
    }
}

我的完整代码:https://www.luogu.com.cn/paste/ju9tq9z0

完整标程(包括变量名等几乎和我一模一样):https://www.luogu.com.cn/paste/8i37fw7n

2024/8/5 20:45
加载中...