题目:2024.9.24 题目

集合

给定正整数 ,有集合 ,对于 的子集 ,计算 ,对 取模。


首先,这道题我们自然不能从选择的方案入手,因为枚举选择的方案数量会达到 这个量级,而 ,因此我们可以从子集的和入手,因为不同的子集可能会有同样的和,而和的数量也仅仅只有

表示为已经选了 中的若干个数,和为 的方案数量。我们枚举 ,则对于任意的 ,不管它是怎么达到 的和的,我们都可以把所有达到 的和的子集加入一个元素 ,便是 ,或者写成 。可以使用压数组+倒序枚举 的方式将其压至一维。

现在我们已经知道任选若干个元素,和为 的方案数了,我们需要将其乘起来,因此枚举 ,我们每次将答案乘上 ,因为有 种方案和为 。注意取模( 数组的取模需要摸 ,因为费马小定理)。时间复杂度为

出租

栋楼,编号 ,每栋楼 个空房间,每房间住一人。对于喜好为 的租客,它只能住在编号为 的楼中。现有 次询问,询问为 的形式,表示来了 个喜好为 的租客, 为负代表租客离开。每次询问你要回答是否能住下所有租客。


由于答案只会有有解、无解的情况,因此我们考虑判断无解。对于任意一段租户 ,如果它们的总人数大于 时,便有人住不到房间,就是无解的情况。对其作差,得到不等式 。因此,我们可以搞出一个序列 ,只需要维护 的最大字段和,询问的时候看一下是否大于 即可。

维护最大字段和的数据结构可以选可爱的线段树。由于只有单点修改,不需要打懒标记,甚至都不需要写区间查询,只需要访问 就行了。最重要的是要开 倍。

联通块

有一棵根为 的树,点的编号为 ,第 个点的权值为 ,dfs 序为 。你需要在树上找到权值和最大的联通块,满足 的性质: 若同时存在于连通快内, 不能相邻。输出最大和。


暴力思路:枚举所有顶点选择的可能,判断一下是否在一个联通块内(使用并查集),然后判断 dfs 序是否相邻,如果都满足条件就可以直接加起来取最值了。时间复杂度 ,成功骗到 分。

跳棋

的棋盘,每一个格子里最初的形式为 表示该格子没有棋子, 反之, 表示不知道。一个棋子可以跳过它旁边的棋子,到它旁边的棋子的下一个位置,仅当那个位置没有棋子。对于所有可能的开局,你可以操作若干包括 步,问你每一种开局下面结束状态的数量,的和。


对于每一个 的方格,我们枚举所有的可能性,然后使用记忆化搜索搜出所有可能的结束状态(用状态压缩将 序列压缩到整数内),所有加起来即可。时间复杂度 。成功骗到 分。

总结

  • 排名
  • 比赛分数
  • 情况:相比与 2024.9.23 模拟赛,较好;
  • 问题:树形 dp、序列 dp 能力较差。