A

先将其压成二进制数,考虑两个人 $(i,j)$ 他们不可能拥有相同的通过数当且仅当它们不同的位的数量是奇数,也就是 $x\text{ xor } y$ 有奇数个 $1$。

然后我赛时直接冲了个 FWT 过了

稍微分析一下,发现两个数不同,当且仅当一个是 $1$ 一个是 $0$,我们只考虑这些不同的位置,发现恰好一个 $1$ 的数量是奇数一个是偶数。反过来也是对的。所以统计一下有奇数个 $1$ 和偶数个 $1$ 的数量,乘起来就好了。

B

$C_{i,j} = A_i + B_j$。我们考虑第 $i$ 行,就是 $B$ 序列整体加上了一个 $A_i$,于是差分一下就可以算出 $B$ 序列的差分序列。考虑列也可以算出 $A$ 序列的差分序列。

首先如果通过不同的行/列算出的差分序列不同一定是无解的。

现在关键在于决定 $A_1,B_1$ 是啥,知道这个之后就可以推出来了。首先我们有 $A_1+B_1 = C_{1,1}$,然后由于这个题要求非负整数,根据差分数组的前缀和的最小值,我们还有两个限制 $A_1 \geq l_1,B_1 \geq l_2$。随便找出一组可行解那么它一定满足限制。

C

我们考虑估一个答案的下界:$\lfloor \log_2 n \rfloor$。因为所有形如 $2^x$ 的数字组成了一个团。

那么我们考虑如何构造能让如果 $x|y$,那么 $a_x \neq a_y$:可以想到如果 $x$ 整除 $y$,那么 $x$ 唯一分解后 $\sum e_i$ 一定是小于 $y$ 的,所以我们构造这个序列即可。

注意特判 $1$,所以其实整体都是要加一的,那个下界也应该是 $\lfloor \log_2 n \rfloor + 1$。

另一种做法:考虑将 $n$ 的因数分解为若干组,每一组满足两两都是除数/被除数的关系。每一组都是一个团,所以我们只需要找到这些团的最大值然后加一就好了。简化一下:也就是找到所有因数的答案的最大值加一就好了。

D

欧拉回路有一个经典的结论:求出一个 dfs 树后等价于 dfs 树上若干个树环(只包含一个非树边)的异或。

但是这个题需要求有 $k$ 个奇点的数量怎么办?我们求欧拉回路的时候如果有奇点一般的处理方法都是建立一个新点,连所有奇点。由于奇点一定有偶数个,所以连完之后一定变成一个欧拉图。我们考虑用类似的方法计数:

首先肯定要分联通块考虑,设一个 $n$ 个点 $m$ 条边的联通块,选出恰好 $k$ 个奇度点($k$ 是偶数)的方案是:首先我们要选出这 $k$ 个点向新点连边,这一部分方案是 $\binom{n}{k}$;然后我们要选一些新图上的树环,但是注意:由于我们钦定了奇度点,所以我们必须选择连接之后新产生的环,而原先的环的数量显然是 $m-n+1$。所以答案就是 $\binom n k 2^{m-n+1}$。

多个联通块卷起来就好了。复杂度 $O(n^2)$。可以用分治+NTT之类技巧优化到 $O(n \log^2 n)$ 但是没必要。

E

考虑容斥。我们枚举把它划分成 $t$ 个段,每段内都要相同,那么每段内可以取的数字就是从 $1$ 到这一段的最小值,对答案的贡献是 $(-1)^{n-t}$。

我们可以把 $(-1)^{n-t}$ 看成 $(-1)^n \times (-1)^t$,然后 dp:设 $f_i$ 表示当前划分了前 $i$ 个数,并且 $i$ 是最后一段的结尾的答案。转移枚举这一段的开头是啥:

$$ f_i = -\sum_{j=1}^i f_{j-1} \times \min(a_{j},a_{j+1},\ldots,a_{i}) $$

这样直接做是 $O(n^2)$ 的。

考虑优化:这个 min 让我们想到用单调栈维护。我们维护一个递增的单调栈 $b_1,b_2,\ldots,b_m$,这里的 $b_i$ 表示在原序列的位置。不难发现在 $[b_i,b_{i+1})$ 的 $j$,都满足 $\min(a_j,a_{j+1},\ldots,a_i)$ 是 $a_{b_i}$。所以我们对于栈内的位置 $i$,维护一下 $sm_i = \sum_{k=b_i}^{b_{i+1}-1} f_{k-1}$,再维护一个整体的和 $now = \sum_{i=1}^m b_ism_i$ 即可。弹栈的时候相当于合并区间,更新一下即可。复杂度 $O(n)$。

F

比较神仙。。。

考虑一个最显然的暴力:将第 $i$ 个点当前在哪里看成一个 $k$ 元组,每个这样的 $k$ 元组看成一个新图点,权值是所有点的和;新图中的两个点有连边当且仅当它们可以一步到达。问从 $S$ 到 $T$ 的最小瓶颈路。

看到最大值最小我们会去思考二分:设二分了一个上界 $L$,我们现在只需要保留所有权值 $\leq L$ 的状态,检查 $S,T$ 是否连通即可。

由于状态之间的边都是无向边,所以我们考虑转而能否让它们都走到一个确定的状态:不妨让它们都走到能到达的状态的最小值,然后判断是否是同一个点即可。如果和相同就按照编号手动标号。

那么我们跳出二分看一下这个过程:相当于是有 $k$ 个球位置集合为 $\{s_i\}$ 和另外 $k$ 个球 $\{t_i\}$,每次你可以选择一个点走到一个 $h_i$ 比它小的点,走到它们完全相同位置。我们对于原图每个点预处理出所有 $h_i$ 比它小的点中代价最少的(就是路径上最大值最小的),然后每次将一个球移动到它所在的点预处理出的位置,更新一下答案。贪心选最小贡献,一直走到相同为止。走过的路径就是答案。因为这个在二分的基础上每次保证了扩大了尽量小的上界,所以这个东西求出的方案和原问题是等价的。复杂度 $O(n^2 \log n)$。

Last modification:May 13th, 2021 at 04:03 pm
如果觉得我的文章对你有用,请随意赞赏