news 2026/7/2 2:46:01

Subtree Minimum Query

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Subtree Minimum Query

query can be restored as follows:

Let last���� be the answer for previous query (or 00 if i=1� = 1). Then xi=((pi+last)modn)+1�� = ((�� + ����) mod �) + 1, and ki=(qi+last)modn�� = (�� + ����) mod �.

Output

Print m� integers. i�-th of them has to be equal to the answer to i�-th query.

Example
Input
5 2 1 3 2 3 5 2 3 5 1 3 4 4 1 2 1 2 2 3
Output
2 5

解题思路

本题的每次询问相当于在以 x� 为根的子树中,求与 x� 距离不超过 k� 的节点权值的最小值。通过引入 DFS 序,我们可以将树上的子树问题转化为序列上的区间问题。设节点 x� 对应的 DFS 序区间为 [lx,rx][��,��],则合法节点 y� 的 DFS 序需满足 lx≤ly≤rx��≤��≤��。定义 dx�� 为节点 x� 到根节点的距离,由于 y� 是 x� 的后代,两者间的距离即为深度差 dy−dx��−��,因此距离不超过 k� 等价于 dy−dx≤k��−��≤�,即 dy≤dx+k��≤��+�。综上,所求点集可表示为满足 lx≤ly≤rx��≤��≤�� 且 dy≤dx+k��≤��+� 的节点 y� 的集合。

虽然题目要求强制在线处理查询,但我们可以先考虑离线做法以寻求启发。在给定 x� 和 k� 时,约束 dy≤dx+k��≤��+� 意味着合法节点 y� 的深度不超过某一固定上界。因此,我们只需在所有深度不超过 dx+k��+� 且 DFS 序落在 [lx,rx][��,��] 内的节点中寻找最小点权。如果对每个询问单独处理显然会超时,但若允许离线,我们可将询问按 dx+k��+� 升序排序,并按此顺序处理。在处理当前询问前,将深度不超过 dx+k��+� 的所有节点插入线段树(插入位置为节点的 DFS 序,值为其权值)。此时线段树中恰好包含了所有深度不超过 dx+k��+� 的节点,直接查询区间 [lx,rx][��,��] 的最小值即为该询问的答案。

对于在线查询而言,我们无法为每个询问重新构建线段树,但如果能快速获取维护了深度不超过 dx+k��+� 的所有节点的线段树,就能快速查询答案。一个自然的想法是直接保存每个深度对应的线段树,这便引出了可持久化线段树的应用。由于深度为 d� 的线段树是在深度为 d−1�−1 的线段树基础上扩展而来,我们只需在上一深度的历史版本上依次插入当前深度的节点,即可构建出当前深度的版本。只需在处理询问前通过预处理构建可持久化线段树即可,时间和空间复杂度均为 O(nlogn)�(�log⁡�)。

这种利用可持久化线段树扩展历史版本的思路,与 G - Copy Query 相似。

AC 代码如下,时间复杂度为 O((n+q)logn)�((�+�)log⁡�):

#include <bits/stdc++.h> using namespace std; typedef long long LL; const int N = 1e5 + 5, M = N * 2; int a[N]; int h[N], e[M], ne[M], idx; int tin[N], tout[N], d[N]; int p[N]; struct Node { int l, r, mn; }tr[N * 35]; int root[N]; void add(int u, int v) { e[idx] = v, ne[idx] = h[u], h[u] = idx++; } void dfs(int u, int p) { tin[u] = ++idx; d[u] = d[p] + 1; for (int i = h[u]; i != -1; i = ne[i]) { int v = e[i]; if (v == p) continue; dfs(v, u); } tout[u] = idx; } int modify(int u, int l, int r, int x, int c) { int v = ++idx; tr[v] = tr[u]; if (l == r) { tr[v].mn = c; } else { int mid = l + r >> 1; if (x <= mid) tr[v].l = modify(tr[u].l, l, mid, x, c); else tr[v].r = modify(tr[u].r, mid + 1, r, x, c); tr[v].mn = min(tr[tr[v].l].mn, tr[tr[v].r].mn); } return v; } int query(int u, int l, int r, int ql, int qr) { if (l >= ql && r <= qr) return tr[u].mn; int mid = l + r >> 1; if (qr <= mid) return query(tr[u].l, l, mid, ql, qr); if (ql >= mid + 1) return query(tr[u].r, mid + 1, r, ql, qr); return min(query(tr[u].l, l, mid, ql, qr), query(tr[u].r, mid + 1, r, ql, qr)); } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m; cin >> n >> m; for (int i = 1; i <= n; i++) { cin >> a[i]; } memset(h, -1, sizeof(h)); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; add(u, v), add(v, u); } idx = 0; dfs(m, 0); iota(p + 1, p + 1 + n, 1); sort(p + 1, p + n + 1, [&](int i, int j) { return d[i] < d[j]; }); idx = 0; tr[0].mn = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { root[d[p[i]]] = modify(root[d[p[i - 1]]], 1, n, tin[p[i]], a[p[i]]); } int ret = 0; cin >> m; while (m--) { int x, k; cin >> x >> k; x = (x + ret) % n + 1, k = (k + ret) % n; ret = query(root[min(d[p[n]], d[x] + k)], 1, n, tin[x], tout[x]); cout << ret << '\n'; } return 0; }

对本题进一步扩展。假设每次查询的是在以 x� 为根的子树中,求与 x� 距离至少为 lb�� 且不超过 ub�� 的节点权值最小值,约束条件将变为 lx≤ly≤rx��≤��≤�� 且 dx+lb≤dy≤dx+ub��+��≤��≤��+��。在强制在线的情况下,上述的可持久化线段树做法不再适用,可能需要用树套树来维护深度与 DFS 序的两维约束,由于博主不了解这里暂不展开讨论。若允许离线处理,则可使用 dsu on tree 来解决。

具体而言,先将询问按节点 x� 分类,分发到每个对应的节点。在 dfs 遍历树的过程中,对于当前节点 x�,先求解其所有轻儿子的答案,再求解重儿子的答案。此时利用线段树维护重儿子对应子树中各节点在其深度位置上的权值,接着将轻儿子对应子树的节点也插入该线段树。最后,对于当前节点 x� 的所有询问,直接在维护好

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 2:45:06

给阿嬤一封来自云端的信(上)

用 AI 替你写一封给阿嬤的家书。项目本身很简单&#xff0c;但从模型调用、云函数、数据库、静态托管到一键部署&#xff0c;全部基于云开发&#xff0c;AI 工具使用云开发提供的大模型完成。 本文不以功能为重点&#xff0c;而是以工程化思维为线索&#xff0c;拆解一个应用从…

作者头像 李华
网站建设 2026/7/2 2:44:58

我把《易经》做成了AI,发现了沟通的底层规律

我把《易经》做成了AI&#xff0c;发现了沟通的底层规律今天想聊一个有点不一样的话题—— 《易经》和AI&#xff0c;能碰撞出什么&#xff1f; 先别急着划走&#xff0c;这不是一篇讲玄学的文章。 这是一篇关于"沟通"和"系统"的深度思考。一、先说一个观察…

作者头像 李华
网站建设 2026/7/2 2:43:54

AI Agent 时代,决策质量才是企业跑赢同行的真正原因

一个让管理者不舒服的数据麦肯锡对金属与采矿行业过去 20 年的 TSR&#xff08;股东总回报&#xff09;做了系统性复盘&#xff0c;结论出人意料&#xff1a;超额回报中&#xff0c;有 30% 到 50% 来自管理层的主动决策&#xff0c;而非商品价格周期。以钢铁为例&#xff0c;生…

作者头像 李华
网站建设 2026/7/2 2:39:38

关于算法优化的渐进式重构与代码级实践的技术7

算法优化的重要性与挑战算法优化在提升性能、降低资源消耗方面的核心价值实际开发中面临的挑战&#xff1a;技术债务、耦合代码、性能瓶颈渐进式重构的基本原则小步快跑&#xff1a;通过迭代降低风险测试驱动&#xff1a;保障重构过程中的功能稳定性性能监控&#xff1a;建立基…

作者头像 李华
网站建设 2026/7/2 2:38:00

孤能子视角:Karpathy LLM Wiki,一个人工观察符自动编织系统

(在以下的与AI互动中&#xff0c;在EIS理论约束下&#xff0c;DeepSeek叫信兄&#xff0c;Kimi叫酷兄&#xff0c;我呢叫水兄。姑且当科幻小说看) 讨论源于文章:【Karpathy又封神&#xff0c;掀翻RAG&#xff0c;把你的笔记变成第二大脑】 https://m.toutiao.com/is/_EjshnuXUC…

作者头像 李华
网站建设 2026/7/2 2:36:29

URL 使用规范

文章目录一、URL 简介二、服务端三、客户端2.1、客户端构造的 URL 地址的正确方式2.1.1、直接构造2.1.2、使用NSURLComponents构造2.2、服务器下发的 URL 的正确使用方式2.2.1 直接使用2.2.2 防护之后使用2.2.3 二次加工之后使用2.3、读取 URL 中的参数处理 URL 是常见的开发需…

作者头像 李华