SSY20240805提高组T3题解

1 篇文章 0 订阅
1 篇文章 0 订阅

题面

题意描述

给定一棵 𝑛 个结点的树,树上每条边长度为 1,每个点有点权a_{i}​。 小 Z 是一只萨卡班甲鱼,它来到树上游玩,他会按照某个 1 到 𝑛 的全排列 𝑏 进行 分为 𝑛 − 1 部分的移动,在第 𝑖 部分,它会从𝑏i走到 b_{i+1},步长为𝑐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

数据范围

n\leq 50000,\;a_i\leq10000

题解

分析

这题是一道根号分治的题目

此题最重要的就是跳的步数ci

c_i\geq \sqrt{n}, 说明跳的步数一定小于\sqrt{n}, 直接利用LCA暴力模拟跳即可

c_i\leq \sqrt{n}, 则跳的步数很多, 暴力跳肯定不可以

我们发现, 从i走到1节点, 步长为c_i, 走过的节点深度在mod\;c_i的条件下同余

所以我们要预处理每个节点到根节点之间所有节点在mod\;c_i(\leq\sqrt{n})条件下同余的前缀和

这是某个树中的一条链, arc[i][j]表示i节点到1节点 间所有深度在mod\;j条件下同余的点值和

eg: arc[6][2]:从6跳到1, 步长为2, 经过6,4,2号节点, 它们的深度%2 都等于0; arc[6][3]同理

 预处理出这个后,对于点i,j(步长为c),其权值和为

arc[i][c]+arc[j][c]-2*arc[father[LCA(i,j)]][c]

请注意, 如果LCA(i,j)的深度与i,j同余, 记得减去一次LCA(i,j)的权值(如下图)

此时如果求7,8(步长为2)的权值和, 1的权值可能会被加两次, 要减去一次;

到这里就结束哩

AC Code

先欠着,明天晚上再给

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值