P1056树上查询(mock2query)

时间限制 2000 ms内存限制 1024 MiB通过率 —
显示算法标签树 · LCA · 二分答案 · 线段树

【题目描述】

小 S 正在整理一批层层归档的资料,小 N 则不断提出需要核对的范围。为了能够统一处理这些树上查询任务,小 S 将资料之间的层级关系整理成一棵以结点 11 为根、共有 nn 个结点的有根树。

结点按照一次深度优先遍历中首次访问的顺序编号为 1,2,…,n1,2,\ldots,n。因此,每个结点的子树中的结点编号构成一个连续区间,并且这个区间的左端点就是该结点本身。

每个结点 ii 有一个正整数权值 wiw_i。根结点的深度为 11,其余结点的深度等于其父亲结点的深度加 11。

对于任意非空连续区间 [a,b][a,b],记 w(a,b)=∑i=abwiw(a,b)=\sum_{i=a}^{b}w_i,表示这个区间内所有结点的权值之和。

记 d(a,b)=dep⁡(lca⁡(a,a+1,…,b))d(a,b)=\operatorname{dep}\bigl(\operatorname{lca}(a,a+1,\ldots,b)\bigr),其中 lca⁡(a,a+1,…,b)\operatorname{lca}(a,a+1,\ldots,b) 表示结点 a,a+1,…,ba,a+1,\ldots,b 的最近公共祖先,dep⁡(u)\operatorname{dep}(u) 表示结点 uu 的深度。

小 N 共提出 qq 次查询。每次查询给出三个整数 l,r,kl,r,k,要求小 S 在所有满足 l≤a≤b≤rl\leq a\leq b\leq r 且 w(a,b)≥kw(a,b)\geq k 的连续区间 [a,b][a,b] 中,求出 d(a,b)d(a,b) 的最大值。

换言之,每次查询要求计算

max⁡{dep⁡ ⁣(lca⁡(a,a+1,…,b))  |  l≤a≤b≤r,∑i=abwi≥k}.\max\left\{ \operatorname{dep}\!\left(\operatorname{lca}(a,a+1,\ldots,b)\right) \;\middle|\; \begin{array}{c} l\leq a\leq b\leq r,\\[2pt] \displaystyle\sum_{i=a}^{b}w_i\geq k \end{array} \right\}.

保证每次查询均有 k≤w(l,r)k\leq w(l,r),因此至少存在一个满足条件的连续区间。

【输入格式】

从文件 query.in\textbf{\textit{query.in}} 中读入数据。

本题包含多组测试数据。

输入的第一行包含两个非负整数 c,Tc,T,分别表示测试点编号与测试数据的组数。c=0c=0 表示该测试点为样例。

对于每组测试数据:

第一行包含两个正整数 n,qn,q,分别表示树的结点数量与查询数量。

第二行包含 n−1n-1 个正整数 p2,p3,…,pnp_2,p_3,\ldots,p_n,其中 pip_i 表示结点 ii 的父亲结点。

第三行包含 nn 个正整数 w1,w2,…,wnw_1,w_2,\ldots,w_n,表示每个结点的权值。

接下来 qq 行,每行包含三个正整数 l,r,kl,r,k,描述一次查询。

输入保证结点编号符合题目描述中的深度优先遍历顺序。

【输出格式】

输出到文件 query.out\textbf{\textit{query.out}} 中。

对于每次查询,输出一行一个正整数,表示满足条件的连续区间中 d(a,b)d(a,b) 的最大值。

【样例 1 输入】

0 15 41 1 3 32 1 3 2 41 5 63 5 42 4 51 2 3

【样例 1 输出】

2321

【说明/提示】

【样例 1 解释】

对于第一次查询,可以选择区间 [3,5][3,5]。该区间的权值之和为 99,其中所有结点的最近公共祖先为结点 33,深度为 22,因此答案为 22。

对于第二次查询,可以选择区间 [5,5][5,5]。结点 55 的权值为 44,深度为 33,因此答案为 33。

【样例 2】

见选手目录下的 query/query2.in\textbf{\textit{query/query2.in}} 和 query/query2.ans\textbf{\textit{query/query2.ans}}。

该组样例符合测试点 1∼21\sim2 的数据范围。

【样例 3】

见选手目录下的 query/query3.in\textbf{\textit{query/query3.in}} 和 query/query3.ans\textbf{\textit{query/query3.ans}}。

该组样例符合测试点 3∼53\sim5 的数据范围。

【样例 4】

见选手目录下的 query/query4.in\textbf{\textit{query/query4.in}} 和 query/query4.ans\textbf{\textit{query/query4.ans}}。

该组样例符合测试点 6∼96\sim9 的数据范围。

【样例 5】

见选手目录下的 query/query5.in\textbf{\textit{query/query5.in}} 和 query/query5.ans\textbf{\textit{query/query5.ans}}。

该组样例符合测试点 10∼1310\sim13 的数据范围。

【样例 6】

见选手目录下的 query/query6.in\textbf{\textit{query/query6.in}} 和 query/query6.ans\textbf{\textit{query/query6.ans}}。

该组样例符合测试点 14∼2014\sim20 的数据范围。

【样例 7】

见选手目录下的 query/query7.in\textbf{\textit{query/query7.in}} 和 query/query7.ans\textbf{\textit{query/query7.ans}}。

该组样例符合测试点 21∼2521\sim25 的数据范围。

【数据范围】

对于 100%100\% 的数据,保证 1≤n,q≤2×1051\leq n,q\leq2\times10^5,单个测试点内所有测试数据满足 ∑n,∑q≤2×105\sum n,\sum q\leq2\times10^5。

测试点编号nnqq特殊性质
1,21,2n≤300n\leq300q≤300q\leq300无
3∼53\sim5n≤2×103n\leq2\times10^3q≤2×103q\leq2\times10^3无
6∼96\sim9n≤2×105n\leq2\times10^5q≤2×105q\leq2\times10^5A
10∼1310\sim13n≤2×105n\leq2\times10^5q≤2×105q\leq2\times10^5B
14∼2014\sim20n≤2×105n\leq2\times10^5q≤2×105q\leq2\times10^5C
21∼2521\sim25n≤2×105n\leq2\times10^5q≤2×105q\leq2\times10^5无

特殊性质 A:对于所有 2≤i≤n2\leq i\leq n,均有 pi=i−1p_i=i-1。

特殊性质 B:对于每次查询,均有 k=w(l,r)k=w(l,r)。

特殊性质 C:对于每次查询,均有 k≤min⁡i=lrwik\leq\min_{i=l}^{r}w_i。

对于所有测试数据,保证:

  • 0≤c≤250\leq c\leq25,1≤T≤101\leq T\leq10。
  • 对于所有 2≤i≤n2\leq i\leq n,均有 1≤pi<i1\leq p_i<i。
  • 对于所有 1≤i≤n1\leq i\leq n,均有 1≤wi≤1091\leq w_i\leq10^9。
  • 对于每次查询,均有 1≤l≤r≤n1\leq l\leq r\leq n,1≤k≤w(l,r)1\leq k\leq w(l,r)。

【题解】

已公开 1 篇题解,官方题解会优先显示。

查看题解