AtCoder好难,根本不会
A. Two Choices
1 |
|
B. Plus Matrix
1 |
|
C. ℕ Coloring
1 |
|
D. Odd Degree
题意
给定一张图,求奇点个数为 $k(0 \le k \le n)$ 的生成子图的数量。
题解
首先考虑树的生成子图的奇点情况:对于一个固定的奇点点集,如果集合大小为偶数,生成子图唯一;如果集合大小为奇数,不存在生成子图。
证明:对于一棵有根树,首先判断叶子节点是否在集合中,如果在集合中,该叶子的父边一定在生成子图中;
去掉这样的叶子和父边,减去度数贡献后,有一个新的度数为奇数的点集,此时对于没有儿子在集合内的点,我们只能取它的父边(否则会选入不在集合内的结点);
递归向上选取边集,因此树的生成子图的边集唯一确定。
因此对于一棵有 $n$ 个点的树,当k为偶数时,奇点个数为 $k$ 的生成子图的数量为 $C_n^k$ 。
然后考虑联通图:对于联通图,可以将它视为树+非树边;
那么如果我们首先确定一个非树边的边集,此时我们获得了一个奇点点集 $S’$。如果我们最终要获得一个大小为 $k$ 的奇点点集 $S$,那么我们对于树的生成子图所需的奇点集合唯一确定。因此,我们需要的 树的生成子图 唯一确定。
暴力枚举非树边是否被选,有 $2^{m-n+1}$ 种情况。因此当 $k$ 为偶数时,联通块的答案为 $2^{m-n+1}C_n^k$ 。
对于不同的联通块,dp合并计算答案即可。复杂度 $O(n^2)$ 。
代码
1 |
|
E. LEQ and NEQ
题意
给定一个长度为 $n$ 的序列 $a_i$ ,求满足
$1 \le x_i \le a_i$
$x_i \neq x_{i+1}(1 \le i \le i - 1)$
的序列 $x_i$ 的数量。
题解
考虑容斥。令 $dp[i]$ 为前缀 $i$ 的答案。那么对于以 $i$ 结尾,满足 $x_{i-len+1}=x_{i-len+2}=…x_i$ 的序列的数量为 $dp[i-len+1]*min(x_{i-len+1},x_{i-len+2}…x_i)$ 。(相当于合并进一个 $dp[j]$ 的前缀,每次连接部分可能有相邻相等的答案,对这部分进行容斥)。
我们可以利用单调栈维护最小值,在枚举时,假设 $a_i$ 为最小值的左侧区间为 $[l,i-1]$ ,我们可以维护 $sum[i] = dp[i-1]-dp[i-2]+dp[i-3]…$ 进行容斥。
那么对于$a_i$ :
如果 $a_i \ge a_{top}$ ,那么以$[l,top-1]$ 为左端点, $i$ 为右端点的区间最小值为 $a_i$
否则 $1-top$ 部分的贡献为 $pre[top]$ ,其中 $pre[top]$ 为 $1-top$ 中若干段区间×最小值的答案之和。
代码
1 |
|