题面
题意描述
给定一棵 𝑛 个结点的树,树上每条边长度为 1,每个点有点权。 小 Z 是一只萨卡班甲鱼,它来到树上游玩,他会按照某个 1 到 𝑛 的全排列 𝑏 进行 分为 𝑛 − 1 部分的移动,在第 𝑖 部分,它会从𝑏i走到
,步长为𝑐i,这意味着它每 次会从当前停留的点向前走𝑐i条边再停下,因为小 Z 是一只聪明的萨卡班甲鱼,所以它 走的是向当前部分终点的最短路径,而且保证每部分路径长度是对应步长的整数倍。 现在,对于旅程的每一部分,小 Z 都想知道它在移动过程中停留过的所有点的权值和。
输入格式
第一行包含一个正整数 𝑛。 第二行包含 𝑛 个正整数,代表𝑎1⋯𝑎n。 接下来的 𝑛 − 1 行每行两个整数 𝑢,𝑣,表示 𝑢,𝑣 之间有一条边。 接下来一行包含𝑛 个正整数,代表𝑏1⋯𝑏n,保证为一个 1 到 𝑛 的全排列。 接下来一行包含 𝑛 − 1 个正整数,代表𝑐1⋯𝑐n−1
输出格式
输出 𝑛 − 1 行,每行一个整数,依次表示旅程每部分停留过的所有点的权值和。
输入输出样例
输入数据 1
8
1 4 5 5 2 1 4 5
1 2
2 3
1 4
4 5
1 6
5 7
5 8
5 2 7 3 1 6 8 4
3 4 1 1 1 4 2
输出数据1
6
8
21
10
2
6
10
数据范围
题解
分析
这题是一道根号分治的题目
此题最重要的就是跳的步数ci
若, 说明跳的步数一定小于
, 直接利用LCA暴力模拟跳即可
若, 则跳的步数很多, 暴力跳肯定不可以
我们发现, 从走到1节点, 步长为
, 走过的节点深度在
的条件下同余
所以我们要预处理每个节点到根节点之间所有节点在条件下同余的前缀和
这是某个树中的一条链, 表示
节点到1节点 间所有深度在
条件下同余的点值和
eg: :从6跳到1, 步长为2, 经过6,4,2号节点, 它们的深度%2 都等于0;
同理
预处理出这个后,对于点(步长为
),其权值和为
请注意, 如果的深度与
同余, 记得减去一次
的权值(如下图)
此时如果求7,8(步长为2)的权值和, 1的权值可能会被加两次, 要减去一次;
到这里就结束哩
AC Code
先欠着,明天晚上再给