模拟赛 24 题解
思维+树状数组+最短路+背包+计数+状压
A.宝藏
发现中位数是递减的关系,所以我们可以预处理出所有答案。
按权值降序排序,那么随着 的增加,中位数一定后移。
只要 前面最小的 个的和和后面最大的 个的和再加它自身 就是合法的,否则继续后移。
查询动态区间 小和,我采用树状数组+二分,也可以树状数组上倍增,更快。
1.注意 ,加入BIT的时候要整体加。
2.注意可能存在多个 相等的情况,二分的时候注意一下。
B.寻找道路
比较有意思,之前没见过。
一开始的想法是先走 再走 ,但这样在 相同的情况下没法确定大小关系。
正确做法就是把 相同的放在一起跑就好了,同时走 再走 。
注意 的特殊性,一开始要找出所有走 边能到达的点,代价一样且都是最小的。
C.猪国杀
jzp yyds!
正解是容斥,可以去wkp's blog,这里提供一下jzp的背包做法。
考虑只有比某个值小才有贡献,那么我们可以钦定 为最大值进行 。
设 表示考虑了前 张牌,点数和为 的方案数。
那么考虑新来一张牌的影响:如果点数在 内,则可以直接由前面的状态转移,为 ,可以前缀和优化。
如果 ,那么不能拿进来,还是从 转移。
考虑统计答案,同样是钦定一个最大值 ,枚举前面 的张数 ,它们的和 。
由于要钦定 ,所以只能从最大值为 的 转移。
还剩下的空间是 ,剩下的牌数是 张。
我们只要保证剩下的 张牌的总空间小于 就可以了,没必要占满。
这些方案是 。一边 一边统计就好了。
D.数树
好题。
首先 , 可以想到状压表示每个点是否被映射。
那么我们枚举 的根是什么,这样就形成了 “不同“的树的形态。
我们进行树形dp找每个形态对应的位置。
设 表示 的儿子里面对应 的状态为 ,这里不包含 自身。定义每个点的儿子集合为 ,方便转移。
我们枚举 的儿子 ,再枚举它对应的点 。如果 想对应 的话,那么 的儿子应该对应 的儿子。
所以这个方案数是 ,与 相乘累加到 上。
最终状态就是 的儿子对应了 。
但是这样肯定会算重,因为再枚举根的时候,并不能保证这 种形态都是不同的,也就是说它们一开始就是 "同构" 的。
所以只要看 中的自身对应了多少种 的形态就好了,最后除掉这部分就是最终方案。