这个问题的核心是找到一条能使路径值序列的逆序对数量最大化的简单路径。
路径与逆序对:树中的任意两个节点u和v之间都存在一条唯一的简单路径。对于一条路径,我们可以从u走到v,也可以从v走到u,这会产生两个方向相反的序列。假设从u→v的序列是B,那么从v→u的序列就是B的逆序。一个序列的逆序对数量和其反转序列的非逆序对(即满足i<j且Bi<Bj的配对)数量是相同的。因此,我们对于一条确定的路径(无向),需要计算两个方向的逆序对数量,并取其中的较大值。
暴力枚举:最直接的想法是枚举所有的简单路径。一条简单路径由其起点和终点唯一确定。我们可以枚举所有O(n2)个节点对(u,v)作为路径的端点。对于每一对(u,v),我们找出它们之间的路径(例如使用BFS或DFS,时间O(n)),然后计算路径序列的逆序对数量(暴力计算为O(n2),使用归并排序或树状数组为O(nlogn))。这样总复杂度至少为O(n2⋅n⋅n)=O(n4),对于n=300来说太慢了。
优化思路 - 固定起点:我们可以优化这个过程。与其枚举路径的两个端点,不如枚举路径的一个端点,然后通过遍历找到所有以它为起点的路径。
在一个树形的通信网络中,有 n 个设备,编号为 1 到 n。每个设备 i 有一个优先级 ai。网络中的设备通过 n−1 条双向链路连接,且保证任意两个设备之间有唯一的一条简单路径相连。
现在需要从网络中选择一条简单路径(即路径上的设备不重复经过)。对于选定的路径,可以任选一端作为起点,按经过顺序记录沿途设备的优先级,得到一个数列。在该数列中,若存在两个位置 i<j 且第 i 个数字大于第 j 个数字,则称它们构成一个“冲突对”。我们取一条路径所有可能数列中冲突对数量的最大值作为该路径的冲突对数量。求所有可能的简单路径中,冲突对数量的最大值。
数据范围:设备数量 n 满足 1≤n≤300,优先级 ai 均为不超过 105 的正整数。
第一行包含一个整数 n (1≤n≤300)。 第二行包含 n 个整数 a1,a2,…,an (1≤ai≤105),依次表示设备 1 至 n 的优先级。 第三行包含 n−1 个整数 p2,p3,…,pn,其中 pi 表示设备 i 与设备 pi 之间存在一条链路。保证 1≤pi<i。
输出一个整数,表示所有简单路径中冲突对数量的最大值。
输入
1
42
输出
0
说明
设备数量 n=1,网络中只有 1 个设备,不存在至少包含两个设备的简单路径,因此无法形成任何冲突对,最大冲突对数量为 0。
输入
3
3 1 2
1 2
输出
2
说明
设备优先级分别为 a1=3、a2=1、a3=2,树形结构为一条链 1−2−3。
所有简单路径及其冲突对情况:
1。0。2。2。因此所有简单路径中冲突对数量的最大值为 2。
输入
4
5 3 4 2
1 2 1
输出
4
说明
设备优先级分别为 a1=5、a2=3、a3=4、a4=2,树边为 (1,2)、(2,3)、(1,4)。
考虑路径 4→1→2→3,其数列为 [2,5,3,4]。
4 对。该方向上的逆序对为 (5,3)、(5,4),共 2 对。因此这条路径在该方向上的冲突对可按其顺序对计算,为 4。4 对。无论正向还是反向,该路径的冲突对数量均可达 4,并且这是所有简单路径中的最大值。
输入
5
2 2 3 1 1
1 2 3 4
输出
6
说明
设备优先级为 2,2,3,1,1,树结构为一条链 1−2−3−4−5。
关注路径 1→2→3→4→5,数列为 [2,2,3,1,1]。
2 与后面两个 1 可形成 2×2=4 对,3 与后面两个 1 可形成 2 对,共 6 对。注意相等的值不构成冲突对。2 与 3 构成 2 对。取该方向上的冲突对数量为 6。若考虑路径反向 [1,1,3,2,2],顺序对有 6 对,同样可达到 6。其余路径均无法超过此值,故最大冲突对数量为 6。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册