*B.Unplanned Queries
又zz了。
把路径覆盖拆成两个点分别覆盖其到根的路径,使得操作独立。
点 x x x的父边会被覆盖 x x x子树所有点的操作次数之和 s u m x sum_x sumx,即 s u m x sum_x sumx为偶,因为每条边都需要满足条件,所以递推下去即除根外所有点操作次数必须为偶。
判断操作次数为奇的点个数是否 ≤ 1 \leq 1 ≤1即可。
C.Closed Rooms
第一轮先努力向外走 k k k步,发现后面的操作都是先开距离在 k k k内的锁,然后走 k k k步——相当于直接没有障碍地向外拓展。
所以走完第一轮后,每次都向外 B F S BFS BFS拓展 k k k步直到到达边界。
D.Black and White Tree
若最后图中存在不与黑点相连的白点,则先手胜。
考虑贪心地选择度数最小的白点让其满足条件:每次选择一个叶子结点的父结点染成白色,后手必须把叶子结点染成黑色——若该父结点的儿子结点不止一个,则先手必胜。否则相当于删去了这对点。
所以把点都安排成儿子和父亲的点对,如果有剩下的点则先手胜。
E.Blue and Red Tree
一次操作等价于拆开两个连通块之间的唯一的连边(树上路径唯一),在两个连通块之间重新连边(可以与原先的连边相同)。
所以每次找到两颗树中之间都有连边的两个连通块,用 s e t set set&并差集启发式合并即可。
考虑最后一次操作,两颗树中必然存在同样的一条连边,可以先合并这两个点然后向外拓展。
代码中可以把两颗树建在同一张图上,判断连通块之间是否存在两条连边即可。( ≥ 3 \geq 3 ≥3条边当然不合法了)
*F.Strange Sorting
很妙的递推方法和结论,直接贴题解