懒得放代码了,真是越来越怠惰了呢。
T1
题目大意:给定一张无向图,每条边起始均为白色。规定当与一个点相连的所有边只有一条边为白色时这条边将会染成黑色。可以手动染黑一些边。求最小染的次数。
手玩样例发现答案为总边数减去生成树边数。图不一定联通,这个结论可以推广到多个连通块。bfs即可。
T2
原题目:AT1218
考虑贪心,从小往大放。根据题意小的一定是往两边放的,发现如果要交换与它交换的只有比它大的数,因为小的数已经放好位置了。现在问题就转化为求逆序对,然后对于两边取min求和即可。
T3
题目大意:有三种动物分别为$A,B,C$,三个的克制关系为:$A ightarrow B,B ightarrow C,C ightarrow A$。有$n$个笼子,每个笼子随机装着一种动物。有两种操作:1.将$v$笼子拆掉,把里面的动物放到$u$笼子来;2.询问使$u$笼子内动物知道现在仍能存活的初始状态的方案数。
我们可以维护一个每个动物存活的概率,然后合并的时候使用并查集。每次合并$u,v$的时候$u$的概率乘$frac{2}{3}$,$v$的概率乘$frac{1}{3}$,然后对于每个集合打lazy tag,find的时候更新子节点。询问的时候概率乘总方案即可。
T4
题目大意:给定一棵树,$q$次询问,每次给定$u,v,k$,请确定$k$条路径使得两两路径的交集为$<u,v>$。求方案数。注意点是有顺序的。保证每个点度数不超过$l$。
我不会$O(ql)$的做法,只会$ql^2$的。暂且说一下吧。
首先可以转化题意,变成“在$u$的子树中选两个节点使得它们的LCA为$u$”。显然每个子树内只能选一个节点,然后可以树形背包搞了。设$f_{i,j}$表示前$i$个子树选$j$个的方案数,然后大力转移。注意要去掉$<u,v>$这条链的方案数。不要忘记乘可重集合的排列。
正解是生成函数背包搞,也可以在$ql^2$的基础上预处理一些东西。不太会,咕咕咕……