题意:
给定一颗 n n n个点的树,每条边的距离均为1,对每一个点构造一个 m m m维的坐标,使得任意两点的 m m m维坐标差的绝对值之和等于它们在树上的距离,且 m m m最小。
数据范围:
子任务1(
8
p
t
s
8pts
8pts):第
i
i
i条边连接点
1
1
1和
i
+
1
i+1
i+1;
子任务2(
41
p
t
s
41pts
41pts):点
i
i
i连接点
i
/
2
(
i
>
1
)
i/2(i>1)
i/2(i>1);
子任务3(
51
p
t
s
51pts
51pts):无特殊限制
全部数据,
n
≤
100
n\le100
n≤100
题解:
显然坐标经平移后能使有一个点所有维都是
0
0
0,为了方便,将这个点设为根。
对于子任务
1
1
1,
2
2
2,由于给定了树的形态,故猜想以
1
1
1为根是最优的。
对于子任务
1
1
1,
1
1
1的孩子将其中一维坐标变为
1
1
1或
−
1
-1
−1,故每两个孩子共用一维坐标(分别为
1
、
−
1
1、-1
1、−1)其它维均为
0
0
0,
m
=
(
n
−
1
)
/
2
m=(n-1)/2
m=(n−1)/2最优(显然以其他点为根不会更优)。
对于子任务
2
2
2,因为二叉树形态的对称性,考虑从根往下一层层做,贪心地使当前的维数尽可能小。手模一下前几层,新增加一层时,对于每个点的两个孩子,根据要分别将父亲坐标的维
+
1
+1
+1或
−
1
-1
−1,且与之前的点不冲突的原则,发现有一个可以将父亲最后一维非零数往其符号方向加
1
1
1,而另一个点没得改了,只好新增加一维,而每位可以往
+
1
+1
+1或
−
1
-1
−1两个方向增加。这样保证了前面的维都被用过,即不可能更优。
对于子任务
3
3
3,考虑沿用
2
2
2的思想,但感觉
1
1
1为根不一定最优,于是枚举根。同样一层层做,对于第一个孩子修改最后一维非零数,其它的只能新增一维。但这样做,对于新增加的同一维的
1
1
1和
−
1
-1
−1,若它们存在祖先后代关系,则孩子增加时就会修改到不应修改的一维,要使之合法,就要浪费
1
/
2
1/2
1/2维。考虑如何避免这种浪费,使第一个孩子(修改最后一维非零数的孩子)的孩子数
>
1
>1
>1(如果有的话)即可。
然而这样是
O
(
n
3
)
O(n^3)
O(n3)的,考虑以哪个点为根可以保证不浪费,同理,只要度数
>
1
>1
>1,并使第一个孩子的度数
>
1
>1
>1即可。