1.简单计数:
题意:
求出有多少个序列满足:
(1). 长度为 m,
(2). 序列中的元素由 [0, n − 1] 中的整数构成,
(3). 和为 k。
题解: [隔板法]:
考虑没有第二个限制的情况,问题可以转化为 m + k − 1 个格子里放 m − 1 个球, 因此答案为 C (m−1,m+k−1) 。
接下来考虑容斥,减去至少一个位置不满足的情况,加上至少两个位置不满足的情 况... 若有 p 个位置不满足,方案数为 C (p,m) × C(m−1,(m+k−1)−p×n) 。
source:简单2的n次方枚举
2.佛学骗子:
题意:给定一张二分图,每个点有一个点权。 定义一个点集是骗子,当且仅当存在原图的一个匹配覆盖了这个点集。 定义一个点集是学佛,当且仅当这些点的点权和不小于 t。 求有多少学佛同时也是骗子。
题解: [ Hall 定理 ]:
对于一个二部图 G(X, Y ),X 存在一个匹配的充分必要条件为对于 X 的任意子集 S,S 的邻居个数 N(S) 必须大于等于 S 的大小 |S|。
因此,我们可以分别统计出二分图两侧可行的骗子集合。注意到一个性质,二分图 两侧的是独立的,即两个二分图两侧可行的骗子集合拼成的集合一定是一个满足骗子 的条件。 所以我们可以 O(n × 2 n ) 统计两侧的骗子集合,再通过一个队列计数。
source:不太懂
3.城墙建设:
题意:查找网格中边长不小于L的城墙围城数量,围城为 a × a - [(a − 2) × (a − 2)],中间为空的“回”字形状,只考虑围城墙上没有军事基地。
题解:有点看不懂
source:横竖两个前缀和,分别判段上下左右四条边上是否有军事基地,也就是前缀和相减有差值,枚举时间O(n*m*4)
4.树形区间:
题意:
(1). 若节点 x 被选中且节点 x 不是根节点,那么节点 x 的父亲也需要被选中;
(2)对于选中的每个节点 x,都需要满足:找出所有在 x 的子树内的选中的点,这些点 上的数字互不相同且合在一起是一段连续区间。
求有多少种不同的区间。
题解:
存下所有以 i 为根的子树,数字区间合法的左端点、右端点。进行树形 DP,因为 每颗子树都需要是一段区间,我们只需将区间进行连接。
显然合法左端点、右端点可以分开计算,先以计算合法右端点为例。枚举所有儿子 的所有合法左端点,给每个数字维护一个链表,把这个儿子挂在左端点的链表下面。
维护数组 is[x] 表示 x 能不能作为一个合法的右端点。
从 vi + 1 到 100 枚举 j,如果 is[j−1] =True,那么就可以把一个 j 开头的区间拼 接在后面,那么扫描数字 j 的链表,链表中的每个儿子的合法右端点都能够作为合法 右端点,将他们的 is 标记为 True。再维护每个儿子是否已经在之前的某链表中出现, 避免重复标记。答案显然就为 1 的合法左右端点数的乘积。
时间复杂度 O(n max vi)。
source:不太懂
二分图: %大佬
Hall定理:%%大佬