9458 - 二叉搜索树(tree)

通过次数

13

提交次数

45

时间限制 : 1 秒
内存限制 : 512 MB

【题目背景】

在本题中,二叉搜索树是一种二叉树的树形数据结构,其定义如下:

若二叉搜索树的左子树不为空,则其左子树上所有点的权值均小于等于其根节点的值。若二叉搜索树的右子树不为空,则其右子树上所有点的权值均大于等于其根节点的值。二叉搜索树的左右子树均为二叉搜索树。

【题目描述】

小明有一棵n个节点树,用1-n编号,其中根节点是1,第i个节点的权值为v_i,但是不满足二叉搜索树的要求,小明希望不改变树的形状,仅通过若干次交换(交换是指交换两个节点的权值),使得树变成二叉搜索树。求有多少个节点不用参与交换,即有多少个节点一开始就在正确的位置。

输入

输入的第一行包含一个正整数 n,表示树的节点数量。

接下来n行,每行三个整数v_i 、l_i 、r_i分别表示节点的权值,节点的左儿子编号,右儿子编号,编号的值为0表示树没有,对应的子树。

输出

输出仅一个数字,表示不需要参与交换的节点数量

样例

输入

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

输出

4

提示

【样例1解释】

初始树的状态如下:圈内表示节点编号,圈外数字表示节点对应的权值。

下图为正确的二叉搜索树,其中节点1和节点2的权值需要交换,节点3、4、5、6不需要交换。

【数据范围】

对于所有测试数据有:1≤v_i≤10^9,1≤n≤5×10^5。

特殊性质A: 对于所有的l_i 、r_i要么同时为0,要么同时不为0。

特殊性质B:对于任意的1≤i,j≤n,i≠j,都有v_i≠v_j

来源

云南编程挑战赛