这个问题的核心是找到一条能使路径值序列的逆序对数量最大化的简单路径。
路径与逆序对:树中的任意两个节点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 个节点的数,这棵树的每个节点上都有一个值 ai 。现在小红想要小红回答以下问题:
在树上选择一条简单路径(每个点经过最多一次),并将沿途经过的点的值按顺序写下来(包括起点与终点),之后得到一个序列 B ,并计算这个序列的逆序对个数。小红想知道能够选择的所有路径中逆序对数量最多是多少。
(i,j) 是逆序对当且仅当 i<j,Bi>Bj。
第一行一个正整数 n ;
接下来一行 n 个正整数 ai ,表示节点 i 的值;
接下来一行 n−1 个正整数 pi(2≤i≤n,1≤pi<i) ,表示节点 i 与 pi 之间有一条边。
1≤n≤300,1≤ai≤105
输出一个整数,表示逆序对最多的数量。
输入
5
1 2 3 4 5
1 2 2 4
输出
6