跳转至

二叉树可以维护逆序对吗?

原题链接

题目描述

我们都知道一颗二叉树,有前序、中序、后续三种遍历方式。

其中给定前序和中序,便可以推导出二叉树的后序。

现在给定一颗二叉树的前序和中序遍历,需要你求出二叉树的后序遍历中逆序对的数量。

逆序对: 对于一个包含 \(N\) 个非负整数的数组 \(A[1..n]\),如果有 \(i < j\),且 \(A[i]>A[j]\),则称\((A[i] ,A[j])\)为数组A中的一个逆序对。

其中 \(A[i]\)为第 \(i\) 个遍历到的节点编号。

输入格式

第一行输入一个整数\(n\),表示二叉树节点的个数。节点编号为(\(1,2,...,n\))。

第二行有 \(n\) 个整数,表示二叉树的前序遍历。

第三行有 \(n\) 个整数,表示二叉树的中序遍历。

输出格式

输出两行

第一行输出 \(n\) 个数,表示二叉树的后序遍历,每个数用一个空格分开。

第二行输出一个整数 \(k\),表示二叉树后序遍历的逆序对数量,答案可能会爆 \(int\)

数据范围

  • \(1\le n\le 10^5\)

输入样例1

1
2
3
5
1 2 4 5 3
4 2 5 1 3

输出样例1

1
2
4 5 2 3 1
8

输入样例2

1
2
3
10
2 4 8 6 10 7 3 9 1 5
8 6 10 4 7 2 3 1 5 9

输出样例2

1
2
10 6 8 7 4 5 1 9 3 2
34
回到页面顶部