模拟赛 24 题解

模拟赛 24 题解

思维+树状数组+最短路+背包+计数+状压

A.宝藏

发现中位数是递减的关系,所以我们可以预处理出所有答案。

按权值降序排序,那么随着 rr 的增加,中位数一定后移。

只要 pp 前面最小的 rr 个的和和后面最大的 rr 个的和再加它自身 m\leqslant m 就是合法的,否则继续后移。

查询动态区间 kk 小和,我采用树状数组+二分,也可以树状数组上倍增,更快。

1.注意 t=0t=0,加入BIT的时候要整体加。

2.注意可能存在多个 tt 相等的情况,二分的时候注意一下。

B.寻找道路

比较有意思,之前没见过。

一开始的想法是先走 00 再走 11,但这样在 disdis 相同的情况下没法确定大小关系。

正确做法就是disdis 相同的放在一起跑就好了,同时走 00 再走 11

注意 00 的特殊性,一开始要找出所有走 00 边能到达的点,代价一样且都是最小的。

C.猪国杀

jzp yyds!

正解是容斥,可以去wkp's blog,这里提供一下jzp的背包做法。

考虑只有比某个值小才有贡献,那么我们可以钦定 kk 为最大值进行 dpdp

f[i][j]f[i][j] 表示考虑了前 ii 张牌,点数和为 jj 的方案数。

那么考虑新来一张牌的影响:如果点数在 [1,k][1,k] 内,则可以直接由前面的状态转移,为 p=1kf[i1][jp]\sum_{p=1}^kf[i-1][j-p],可以前缀和优化。

如果 >k>k,那么不能拿进来,还是从 f[i1][j]f[i-1][j] 转移。

考虑统计答案,同样是钦定一个最大值 kk,枚举前面 <k<k 的张数 jj,它们的和 tt

由于要钦定 <k<k,所以只能从最大值为 k1k-1ff 转移。

还剩下的空间是 mtkm-t-k,剩下的牌数是 njn-j 张。

我们只要保证剩下的 njn-j 张牌的总空间小于 mtkm-t-k 就可以了,没必要占满。

这些方案是 i=1mtkf[nj][i]\sum_{i=1}^{m-t-k}f[n-j][i]。一边 dpdp 一边统计就好了。

D.数树

好题。

首先 m10m\leqslant10, 可以想到状压表示每个点是否被映射。

那么我们枚举 BB 的根是什么,这样就形成了 “不同“的树的形态。

我们进行树形dp找每个形态对应的位置。

f[u][S]f[u][S] 表示 uu 的儿子里面对应 BB 的状态为 SS,这里不包含 uu 自身。定义每个点的儿子集合为 son[u]son[u],方便转移。

我们枚举 uu 的儿子 vv,再枚举它对应的点 ii。如果 vv 想对应 ii 的话,那么 vv 的儿子应该对应 ii 的儿子。

所以这个方案数是 f[v][son[i]]f[v][son[i]],与 f[u][S]f[u][S] 相乘累加到 f[u][Si]f[u][S|i] 上。

最终状态就是 uu 的儿子对应了 son[rt]son[rt]

但是这样肯定会算重,因为再枚举根的时候,并不能保证这 mm 种形态都是不同的,也就是说它们一开始就是 "同构" 的。

所以只要看 BB 中的自身对应了多少种 BB 的形态就好了,最后除掉这部分就是最终方案。