ABC 杂题题解

A

首先,我们考虑 \(\sum_{i=l}^ra_i\equiv r-l+1(\bmod k)\) ,其实可以转化成 \(\sum_{i=l}^ra_i\equiv \sum_{i=l}^r 1(\bmod k)\)

也就是 \(\sum_{i=l}^r(a_i-1)\equiv 0(\bmod k)\),同时还要有 \(r-l+1\lt k\)

考虑前缀和优化,\([l,r]\) 之和为 \(0\),即 \(s_r\equiv s_{l-1}(\bmod k)\)。那么,我们记录当前所有的 \(s_i\),从左往右找到所有和当前位置前缀和相等的左端点,用 map 记录,加入贡献。同时将左边已经超出长度要求的左端点从 map 中删除即可。

B

考虑先枚举 \(s=i+j+k\),每次加入“和为 \(s\) 的蛋糕数量”,直到数量超过目标值,然后依次枚举 \(i\)\(j\) 即可。

我们唯一的瓶颈是如何计算 \(1\le i,j,k\le n\)\(i+j+k=s\)\((i,j,k)\) 数量。考虑容斥。首先先不考虑 \(i,j,k\le n\) 的条件,利用插板法求出答案为 \(\binom{s-1}{2}\)

然后减去有一个超过 \(n\) 的情况,我们就强制先给其中一个分 \(n\),然后再插板,\(\binom{3}{1}\binom{s-n-1}{2}\)

但是还要加上有两个超过 \(n\) 的情况,给其中两个分 \(n\) 再插板,得到 \(\binom{3}{2}\binom{s-2n-1}{2}\)

因为我们的 \(s\) 只枚举到 \(3n\),所以不会出现三个都超过 \(n\),则直接返回即可。

C

考虑先处理所有可能的点集是否是完全图。我们可以往已有的点集内加入一个新点并判断它是否和已有的全部点相连。

这样,我们可以枚举点集 \(msk\),并选出其中最小的点 \(x\)。如果去掉 \(x\) 之后依旧是完全图,且 \(x\) 和其中的所有点有边,则满足情况。

然后,我们考虑 \(g_{msk}\) 表示点集 \(msk\) 最少划分成多少个连通块。考虑子集枚举,枚举当前划分出哪个子集作为新加入的完全子图。\(g_{S}=\min {g_{S/A}+1}\),其中 \(A\) 在之前已经被确定是完全子图。

这样的复杂度是 \(O(n2^n+3^n)\) 的,足以通过。

D

考虑二位前缀和,其实我们就是要计算 \(f(n,m)\) 表示 \((0,0)\)\((n,m)\) 的长方形内所有位置的和。只要有计算这个的方法就可以了。

而考虑 \(f(n,m)=\sum_{x\le n,y\le m}\binom{x+y}{y}\)

我们考虑按行求,设 \(d(n',m)\) 表示 \(\sum_{i\le m}\binom{n'+i}{i}\),我们只要对所有的 \(n'\le n\) 计算出 \(d(n',m)\)。而通过组合数的性质可以很容易知道 \(\sum_{i\le m}\binom{n'+i}{i}=\sum_{i\le m}\binom{n+m+1}{m}\)

所以只要枚举 \(n'\) 即可。复杂度 \(O(n)\)

E

首先,我们发现,经过一条边对最终答案的贡献是 \(c_i-P\)。如果这张图存在可以到达 \(n\) 的正环,我们就可以一直在正环里走从而获得任意多的分数。所以先把不能到达 \(n\) 的点删除,然后用 \(SPFA\) 跑最长路并判断正环,最终的答案和 \(0\)\(\max\)

复杂度是 \(SPFA\)\(O(nm)\)

F

考虑两个不能同时选,当且仅当它们的 \(A/B\) 互为负倒数。那么我们可以把 \(A/B\) 划分成若干个组,不同组之间的选择独立。而每个组分成两类,两类不能同时选,本组答案是 \(2^n+2^m-1\)。积起来,最后计算 \(0\) \(0\) 的贡献,每个都只能选一个。可以使用分数形式约分存储,避免除以 \(0\) 的讨论

G

考虑容斥原理,设 \(r_i\) 表示至少有 \(i\) 个位置相同的结果,那么答案就是 \(\sum (-1)^ir_i\)。考虑如何计算 \(r_i\),首先要选择 \(i\) 个位置,方案数 \(\binom {n}{i}\),然后安排内部的方案是 \((m)_{i}\)。接下来安排 \(A\)\(B\) 的剩下 \(n-i\) 个位置是 \(((m-i)_{n-i})^2\)。预处理阶乘可以做到 \(O(1)\) 计算。

H

考虑构造,因为我们发现,首先,如果 \(k\) 的最高位超过了我们已有的最高位,肯定是不行的。否则 \([0,2^m]\) 就会存在 \(k\)。其次,除了 \(m=1\),都有 \(\oplus_{i=0}^{2^m}=0\)。也就是,除了 \(k\) 以外的所有数异或起来都是 \(k\)

所以,我们考虑先放一个 \(k\),然后在两边依次加上所有的其他数。而一个数出现两遍的贡献都是 \(0\),所以每一对数的区间异或都是只有中间的 \(k\)。然后在最后再放一个 \(k\),这样两个 \(k\) 中间所有数都恰好出现了一次,答案也是 \(k\)

唯一的特殊情况是 \(m=1,k=1\)\(m=1,k=0\),一个无解,一个需要特判构造,但是样例都已经给出了。

I

考虑第一步一定是往下或者往右移动。我们枚举第一步的结尾位置,如果是往右,那么它往下直到第一个障碍都可以到达。将其加入答案。设第 \(i\) 行能到达的最右端是 \(mxx_i\),第 \(j\) 列能到达的最下端是 \(mxy_j\),那么答案就是 \(mxx_i+mxy_j+1\),但是这样会算重,因为有的点可能同时被行和列到达。

我们考虑,如果 \(i\)\(j\) 满足 \(mxx_i\ge j\)\(mxy_j\ge i\),就会造成一次算重,所以我们实际上只需要数这样的点对贡献然后删掉即可。这是一个典型的二维偏序,离线后树状数组 \(O((n+m)\log (n+m))\) 解决。

J

考虑一个最左端在 \(L\),最右端在 \(R\) 的子序列,其贡献是 \(L(n-R+1)\)

所以,我们考虑记录 \(dp_{i,j}\) 表示当前 \(dp\)\(i\),总和为 \(j\) 的所有子序列的 \(L\) 之和。那么我们每到达一次 \(S\),就用当前的 \(n-i+1\)\(dp_{i,S}\) 乘起来即可,然后删掉 \(dp_{i,S}\)。或者我们也可以每次将 \(dp_{i,S}\) 加入一次答案且正常转移不删掉,和上面是等价的,每个会被贡献 \(n-R+1\) 次。

复杂度 \(O(nS)\)

posted @ 2023-07-20 14:57  jucason_xu  阅读(5)  评论(0编辑  收藏  举报