当前你的浏览器版本过低,网站已在兼容模式下运行,兼容模式仅提供最小功能支持,网站样式可能显示不正常。
请尽快升级浏览器以体验网站在线编辑、在线运行等功能。

建议使用的浏览器:

谷歌Chrome 火狐Firefox Opera浏览器 微软Edge浏览器 QQ浏览器 360浏览器 傲游浏览器

7097:Just a Data Structure Problem

题目描述
今天热爱数据结构的 mengxin 回想起 TA 刚学线段树时遇到的一道有趣的数据结构题:

给定一棵很大很大的树,由于这棵树太大了,它按照这样的方式输入:

- 初始树上只有 1 个点,编号为 $0$;
- 依次对树进行 $m$ 次操作,第 $i(1 \leq i \leq m)$ 次操作给出整数 $p_i,l_i$,新加入 $l_i$ 个节点并将它们和 $p_i$ 用 $l_i$ 条边串成一条链,使得这条链的一端编号为 $p_i$。设这条链的另一端编号为 $i$,新加入的其他节点没有编号。

$m,p_i,l_i$ 均在输入中给出,同时给出一个长度为 $n$ 的整数序列 $a_1,a_2,\cdots,a_n$,其中 $a_i \in [0,m]$,你需要设计一个数据结构支持:给出序列中的一段区间 $[l,r]$,快速计算 $\sum_{i=l}^r \sum_{j=l}^r \mathrm{dist(a_i,a_j)}$ 的值,其中 $\mathrm{dist}(x,y)$ 表示 $x$ 与 $y$ 在树上的唯一路径经过的边数。

由于当时的 mengxin 只会线段树,甚至求树上距离也只会暴跳,即对于两个点$u, v$,花费$\mathrm{dist}(u,v)$代价求出它们的距离。所以 mengxin 想通过建立线段树解决该问题。具体地,mengxin 将会用以下递归方法对于序列上的区间 $[1,n]$ 建立一棵线段树:

1. 通过 $\sum_{i=1}^n \sum_{j=1}^n \mathrm{dist}(a_i,a_j)$ 次暴跳操作计算当前线段树节点对应的答案;
2. 如果区间长度为 1 退出递归过程;
3. 否则选择 $\mathrm{mid} \in [1,n-1]$,递归对 $[1,\mathrm{mid}]$ 和 $[\mathrm{mid}+1,n]$ 建立线段树。

虽然现在 mengxin 意识到这样无法正确得到答案,同时 TA 已经可以熟练地使用 top cluster 和二次离线莫队秒杀该题,但 TA 似乎还想解决曾经的疑惑:应该如何选择线段树上每个区间的 $\mathrm{mid}$ 使得建立线段树的过程中暴跳次数尽可能少呢?

mengxin 花了 $10^{-40}$ 秒解决了本题,但毒瘤的 mengxin 还想加强一下:称初始序列为第 $0$ 个版本,接下来 mengxin 会给出 $r$ 个版本,第 $i(1 \leq i \leq r)$ 个版本是通过在第 $q_i$ 个版本的序列末尾加入一个元素 $x$ 得到的。注意新增第 $i$ 个版本对第 $q_i$ 个版本没有影响。mengxin 想知道每个版本的答案,但这下 TA 不会做了,所以 TA 找到了聪明智慧的你来帮帮 TA。
输入解释
本题有多组测试数据。

第一行一个整数 $T(1 \leq T \leq 10)$ 表示测试数据组数。

每组测试数据第一行三个整数 $m,n,r(1 \leq m,n \leq 1500, 0 \leq r \leq 300)$ 分别表示建树进行的操作次数,序列的长度和操作序列的次数。

接下来 $m$ 行,第 $i$ 行两个整数 $p_i,l_i(0 \leq p_i \leq i-1, 1 \leq l_i \leq 10^7)$ 描述一次操作。

接下来一行 $n$ 个整数 $a_1,a_2,\cdots,a_n(0 \leq a_i \leq m)$ 描述初始序列。

接下来 $r$ 行,第 $i$ 行两个整数 $q_i , x_i(0 \leq q_i \leq i-1, 0 \leq x \leq m)$ 描述一个版本。
输出解释
对于每组数据输出 $r+1$ 行,第 $i$ 行表示第 $i-1$ 个版本对应的答案。
输入样例
1
4 5 3
0 4
1 3
1 2
0 1
4 0 3 2 4
0 1
1 3
0 0
输出样例
146
210
302
194

该题目是Virtual Judge题目,来自 杭电HDUOJ

源链接: HDU-7097

最后修改于 2021-10-23T19:11:25+00:00 由爬虫自动更新

共提交 1

通过率 0.0%
时间上限 内存上限
10000/5000MS(Java/Others) 524288/524288K(Java/Others)