Problem
二叉树
Description
现在有一棵二叉树,所有非叶子节点都有两个孩子。
在每个叶子节点上有一个权值(有个叶子节点,满足这些权值为的一个排列)。可以任意交换每个非叶子节点的左右孩子。
要求进行一系列交换,使得最终所有叶子节点的权值按照中序遍历写出来,逆序对个数最少。
Input
第一行一个整数。
下面每行一个数,
- 如果,表示这个节点非叶子节点,递归地向下读入其左孩子和右孩子的信息,
- 如果,表示这个节点是叶子节点,权值为。
Output
Sample Input
1 | 3 |
Sample Output
1 | 1 |
HINT
对于的数据:。
标签:线段树合并
Solution
树上贪心时用线段树合并优化复杂度。
考虑朴素贪心,由于子树内如何交换和上面的点如何交换互不影响,只需要对于每个点采用其逆序对数最少的交换方式即可,不用考虑其带来的影响。具体地,对每个点尝试交换/不交换两个儿子,分别求出两种情况下跨过这个点的逆序对数,选取较小的那个即可。如果每次将两棵子树中的所有叶子权值全拿出来归并排序,复杂度是的。
用线段树合并优化求跨过某点的逆序对数。对树上每个点维护一棵值域线段树,存储其子树中叶子节点的权值信息,在尝试交换/不交换两个儿子时,合并这两个儿子的线段树,在合并过程中可以递归算两种情况的逆序对数。如此在合并后取较小的对数计入总答案即可。时间复杂度。
Code
1 |
|