CF1879E Interactive Game with Coloring
题意
交互库给你一棵 n n n 个节点树,你需要给这棵树的边染色,然后交互库要在这棵树上给你玩一个游戏。
交互库会选择一个位置放置一个棋子,但是他不会告诉你这个棋子的位置和深度。
每次交互库会给出棋子所在节点对于每种颜色有几条边,你需要选择一种颜色,交互库会沿着这条颜色的边走,如果有多条该颜色的边,交互库会随便选择边走。
对于每次你都需要引导棋子向根节点走,当棋子走到根节点你将获胜,否则交互库将获胜。
你需要保证获胜的情况下,使得颜色的种数最少。
解析
我们定义:
一个节点往根节点方向的边叫做根向边
一个节点往叶节点方向的边叫做叶向边
有唯一叶向边的节点叫做单子节点
以根节点的儿子为根的子树叫做大子树
首先我们先想到我们可以将边的深度奇偶性来给边进行染色,如图1:
但这样做显然是有问题的,如图2:
当棋子在黑色节点的时候,因为红边和蓝边都只有一条,所以我们就无法判断出该走红遍还是蓝边。
既然两种颜色不行,那就加一种,有三种颜色就好一定能做了,我们可以对边的深度模 3 3 3 交替染色,如图3:
若当前节点有黄蓝两种边,那么就选择走黄边,同理,若当前节点有红黄两种边,那么就选择走红边,若当前节点有红蓝两种边,那么就选择走蓝边。
也就是说,我们最多只需要 3 3 3 种颜色就可以保证赢得交互部,但是 3 3 3 种并不是最优的,考虑是否有特殊情况能减少颜色总数。
我们先来考虑能用 1 1 1 种颜色染色的情况:
这个很简单,即整棵树只有两层,如图4:
再来考虑能用 2 2 2 种颜色染色的情况:
情况一,整棵树只有三层,如图5:
情况二,我们再次回到最开始的图2:
我们发现,对于图2中的单子节点,只要所有的单子节点的深度奇偶性一致就能保证这整棵树能用 2 2 2 种颜色染色。
但是如果所有的单子节点,他们的深度奇偶性不同,那么是不是不能用 2 2 2 颜色然呢?
我们发现,根节点是唯一没有根向边的节点,也就是说,我们可以任意改变根节点叶向边的颜色,例如图6:
那么结论就显然了,如果这个单子节点所在的大子树中深度奇偶性与我们规定的不一样,那就反转该单子节点所在的大子树的所有边的颜色。
如果一颗大子树中,都有深度奇偶性不同的单子节点,那就必须要用 3 3 3 种颜色。
那么这道题的构造部分就完工了,总结一下:
先特判两种特殊情况:
1.整棵树只有 2 2 2 层,那就可以只用 1 1 1 种颜色
2.整棵树只有 3 3 3 层,那就可以只用 2 2 2 种颜色
如果在一棵大子树中,既有深度为奇的单子节点,也有深度为偶的单子节点,那就必须用 3 3 3 种颜色,轮换染色即可。
其余的情况都可以用 2 2 2 种情况染色,先对这整棵树进行交替染色,再看所有的单子节点的根向边颜色是否相同,不同的话,将一部分的单子节点所在的大子树的边全部翻转即可,就可以将所有的单子节点的根向边颜色相同了。
然后建立真值表判断交互库的返回值进行输出就行了。
代码老是UKE不知为什么,不放了。