题目描述
有一个游戏有$n$个关卡,这些关卡排列在一根数轴上,你需要按照一个顺序,从某一个关卡出发,依次前往每一个关卡所在的位置并通关。
但是这个顺序并不是任意的,关卡分为两种,第一种是没有限制的关卡,你可以在任何时候通关,第二种是有限制的关卡,这种关卡里的每一个,都有一个属于第一种关卡的前置关卡,表示必须要先通过前置关卡,才能来通过它。
现在,你需要找到一个最好的顺序,使得玩家的角色在数轴上走的总路程最短。
输入输出格式
输入格式:
- 第一行一个整数$n$。
- 接下来$n$行,第$i$行先有两个整数$x[i]、s[i]$。表示第$i$个关卡在数轴上的坐标和关卡类别。如果$s[i]=2$,则这一行还有一个整数表示前置关卡$p[i]$,数据保证$s[p[i]]=1$。
输出格式:
- 输出$1$行$1$个整数,表示玩家通过所有关卡最少移动的距离。
输入输出样例
输入样例1:
6
1 1
2 2 3
3 1
4 2 3
5 2 1
6 2 1
输出样例1:
7
样例说明1:
- 我们从$1$号关卡出发
- 走$2$步到$3$号关卡
- 走$1$步到$2$号关卡
- 走$2$步到$4$号关卡
- 走$1$步到$5$号关卡
- 走$1$步到$6$号关卡
这样,总距离是$2+1+2+1+1=7$
输入样例2:
8
1 1
2 2 4
3 2 1
4 1
5 2 4
6 1
7 2 6
8 2 6
输出样例2:
10
样例说明2:
- 我们从$4$号关卡出发
- 走$2$步到$2$号关卡
- 走$1$步到$1$号关卡
- 走$2$步到$3$号关卡
- 走$2$步到$5$号关卡
- 走$1$步到$6$号关卡
- 走$1$步到$7$号关卡
- 走$1$步到$8$号关卡
这样,总距离是$2+1+2+2+1+1+1=10$
测试点
语言|C|C++|Python|JAVA -|-|-|-|- 每个测试点时限|2.0秒|2.0秒|10.0秒|2.0秒 内存限制|256MB|256MB|256MB|256MB 测试点数目|20|20|20|20 测试点是否等分|是|是|是|是
数据范围与约定:
对于所有测试点,$1 \le n \le 10^6, 0 \le x[i] \le 10^{12}, s[i] \in {1,2}$,若$s[i]=2$,则有$1 \le p[i] \le n,s[p[i]]=1$
来源/分类