保研/考研模拟赛第一场|清华大学(深圳)|2022年保研夏令营上机笔试
- Status
- Done
- Rule
- IOI
- Problem
- 3
- Start at
- 2023-4-22 14:00
- End at
- 2023-4-22 17:00
- Duration
- 3 hour(s)
- Host
- Partic.
- 20
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
给定一棵有 n 个节点二叉树 T ,树上的每个点 i 有点权 ai 。
考虑二叉树下的先序遍历 t=v1,…,vn ,我们定义其平滑性为
D(t)=1≤i<n∑∣avi−avi+1∣现在,你可以交换任意节点的左右子树,使得树 T 的先序遍历的平滑性最小。
输入的第一行包含一个正整数 n(n≤2000) 。
输入的第二行包含 n 个正整数,第 i 个正整数 ai 为节点 i 的点权,保证 1≤ai≤109 。
输入的第三行包含 n−1 个正整数,第 i 个正整数 fi 为节点 i+1 的父节点,保证 1≤fi≤i 且每个 fi 不会出现超过 2 次。
我们约定 fi 第一次出现时,表示 i+1 是 fi 的左儿子, fi 第二次出现时,表示 i+1 是 fi 的右儿子。
输出一个非负整数,即所求的最小平滑性。
输入
5
1 2 3 4 5
1 1 2 2
输出
6
----------分割线------------
考场上的原数据n≤4e5 , 但是塔子哥还没有明确的解法。希望有大佬能提供标答
假设我们在节点u , 左右节点分别为l,r . 如果先访问l 这一边,那么在l 中最后一个访问的节点,它需要和r 的值作绝对值差。之后访问r 时,r 中最后一个访问的节点,它需要和之前的某个节点做差。
然后又观察到n 比较小。我们自然想到动态规划,一个维度存当前点,另一个维度存最后一个点要去和哪个点做差: