bzoj#P2212. [POI2011] ROT - Tree Rotations

[POI2011] ROT - Tree Rotations

题目描述

给定一颗有 nn叶节点 的二叉树。每个叶节点都有一个权值 pip_i(注意,根不是叶节点),所有叶节点的权值构成了一个 1n1 \sim n 的排列。

对于这棵二叉树的任何一个结点,保证其要么是叶节点,要么左右两个孩子都存在。

现在你可以任选一些节点,交换这些节点的左右子树。

在最终的树上,按照先序遍历遍历整棵树并依次写下遇到的叶结点的权值构成一个长度为 nn 的排列,你需要最小化这个排列的逆序对数。

输入格式

第一行是一个整数 nn,表示树的叶节点个数。

接下来若干行,使用递归的形式来读入这棵树,读入任意一个子树的信息时,初始时读入其根节点。对于一个结点 uu,首先有一行一个整数 xx

  • x0x \neq 0,则表示 uu 是一个叶节点,其权值为 xx
  • x=0x = 0,则表示 uu 不是叶节点,则接下来若干行读入其左子树信息,左子树读入结束后接下来若干行读入其右子树信息。

输出格式

输出一行一个整数表示最小的逆序对数。

3
0
0
3
1
2
1

样例 1 解释

下图中,左图是初始读入的树,右图是操作后的树。

数据范围

  • 对于 30%30\% 的数据,保证 n5×103n \leq 5 \times 10^3
  • 对于 100%100\% 的数据,保证 2n2×1052 \leq n \leq 2 \times 10^50xn0 \leq x \leq n,所有叶节点的权值是一个 1n1 \sim n 的排列。

提示

请注意,nn 不是 树的结点个数。