给定一棵 n 个结点的树,点有点权。有 m 次操作:
1 x 查询 x 的子树内点权最大的点的编号。输出这个编号并将这个点的点权设为 0。2 x y 将 x 的点权加 y。数据范围:n,m≤2×105。
思路很简单,求出 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