题解 Codeforces Round #678 (Div. 2) (CF1436)

A Reorder

观察样例解释易知我们需要判断总和是否为 \(m\) 的倍数。注意特判 \(n=0,m \neq 0\)\(m=0,sum \neq 0\) 的情况。

B Prime Square

\(n\) 是偶数就把两个对角线填上 \(1\) ,这样每行每列的和都是 \(2\)

\(n\) 是奇数就把正中间的一行一列改成中间都是 \(0\) 边界是 \(1\) ,以 \(n=5\) 为例:

\[\textsf{1 0 1 0 1}\\ \textsf{0 1 0 1 0}\\ \textsf{1 0 0 0 1}\\ \textsf{0 1 0 1 0}\\ \textsf{1 0 1 0 1}\\ \]

C Binary Search

按照它的二分过程做,\(a[mid]<=x\) 等价于 \(mid<=pos\) ,这样就可以算出钦定了 \(a\) 个位置必须比 \(x\) 大,\(b\) 个位置必须比 \(x\) 小,\(n-1-a-b\) 个位置可以随便填。于是序列方案就是:

\[\binom{x-1}{a} a! \binom{n-x}{b} b! (n-1-a-b)!\\ =\frac{(x-1)!}{(x-1-a)!} \frac{(n-x)!}{(n-x-b)!} (n-1-a-b)! \]

直接预处理阶乘和阶乘逆元就行。注意判断 \(x-1-a,n-x-b\) 是否是负数,如果是负数直接输出 \(0\)

D Bandit in a City

只能向叶子走意味着每个点的权值只能转移到它子树内所有的叶子节点里,我们只要记录每棵子树的权值和 \(sum_x\) 以及叶子节点个数 \(sz_x\) ,市民采取的最优方案一定是平均,而歹徒采取的最优方案一定是选最大的叶子,所以 \(ans=\max\{\lceil \frac{sum_x}{sz_x} \rceil\}\) 。注意 \(sum_x=0\) 时上取整要特判。

E Complicated Computations

求所有子序列的 \(\textsf{mex}\)\(\textsf{mex}\) ,发现 \(a_i\) 的范围不大,同时意识到 \(\textsf{mex}\) 不会超过 \(\max\{a_i\}+1\) ,考虑枚举答案 \(\textsf{mex} =x\) 。如何检查没有一个子序列的 \(\textsf{mex}=x\) 且所有子序列最大 \(\textsf{mex}=x-1\) ?考虑把 \(x\) 的出现位置记录下来,假设是 \(p_1,p_2,\dots,p_k\) ,我们只需要检查 \([1,p_1],[p_1,p_2],[p_2,p_3],\dots,[p_{k-1},p_k],[p_k,n]\) 这些段的 \(\textsf{mex}\) 即可,这个很容易用线段树或者树状数组维护。每次如果 \(x\) 不是答案就把刚刚检查的区间的 \(x\) 标记为出现过,这个可以直接用取最大值的方式维护,如果 \(x\) 是答案就直接输出。

F Sum Over Subsets

前五题是昨晚写的,有一题 fst 了不过早上起来已经加了个特判改过了。F是早上补的,可惜CF评测队列太长了,暂时不知道我过没过,先鸽着,如果做法是对的就来更。

鸽了这么久,终于来更了……之前做法不太行一直没时间订正……

题目相当于求 $ \sum_{A\in S} \sum_{x\in A} \sum_{y \in B} xy$ ,令 \(sz=S\) 集合元素个数,那么:

  • \(a_i \in S,a_i \in A , a_i \in B:a_i\) 必选,剩下 \(sz-1\) 个数里面选一个删掉,方案是 \(sz-1\) ,剩下的数可选可不选,所以贡献是 \(a_i^2 2^{sz-2} (sz-1)\)

  • \(a_i,a_j \in S,a_i,a_j \in A:\) 如果 \(a_i,a_j\in B\) ,贡献计算同上,是 \(a_ia_j2^{sz-3}(sz-2)\) ,如果 \(a_i\)\(a_j\) 被删了,那么贡献是 \(a_ia_j2^{sz-2}\) ,所以总贡献是 \(a_ia_j(2^{sz-3}(sz-2)+2^{sz-2})\)

对于 \(\gcd=1\) 可以通过反演(容斥)写成这个形式 : \(f(d) = \sum f(x)[d|x],ans=\sum_d \mu(d) f(d)\)

大概就是这样,写起来有点细节。

posted @ 2020-10-25 13:01  kylin_xy  阅读(425)  评论(0编辑  收藏  举报