代码源挑战赛 Round 48

比赛链接

A

简单题

B

简单题

C

本质上就是矩阵乘法,即 \(c _ {i, j} = \sum a _ {i, k} b _ {k, j}\)

D

\(b\)\(a\) 的逆排列,即第 \(i\) 根柱子上的小球最终落到了第 \(b _ i\) 根柱子,显然 \(b _ {a _ i} = i\)

然后我们做的事情是按照 \(h\) 从大到小的顺序,交换 \(b _ p\)\(b _ {p + 1}\)(交换了两根柱子上的球的目的地)。

故从大到小输出 \(h\),做一次冒泡排序即可。

E

二分答案,每次把深度 \(\le mid\) 的点拎出来跑一遍树形 dp 即可。

具体的 dp 模型应该非常经典,这里就不必多说。记得我好像出过一道几乎完全一模一样的题。

F

正常的 dp 就是设 \(f _ {i, x}\) 为经过 \(i\) 秒后每个点的权值,转移是 \(f _ {i, y} \leftarrow f _ {i - 1, x} / deg _ x\)

然而 \(k\) 可能很大,但是我们使用矩阵快速幂加速就好了。

G

\((x _ 1, x _ 2, \ldots x _ k) ^ 2\) 拆开来就是 \(\sum \sum x _ i x _ j\),也就是说两个出现次数为奇数的元素 \(x _ i, x _ j\) 会有 \(x _ i x _ j\) 的贡献。

进一步分析,对于两个不同的元素 \(x, y\),它们会有 \(xy\) 的贡献,方案数为 \(2 ^ {r - l - 1}\),因为 \(x, y\) 取奇数个和取偶数个的概率相等,或者说 \(\sum _ {i \equiv 1 \pmod 2} \binom n i = 2 ^ {n - 1}\)。同理,对于一个元素 \(x\),它会有 \(x ^ 2\) 的贡献,方案数为 \(2 ^ {r - l}\)

到这里实现方法就比较显而易见了:只需要对于 \([l, r]\) 中所有不同的元素 \(x\),求出 \(s1 = \sum x\)\(s2 = \sum x ^ 2\),上文第一部分的贡献就是 \(2 ^ {r - l - 1}(s1 ^ 2 - s2)\),第二部分的贡献就是 \(2 ^ {r - l}s2\)

注意 \(l = r\) 的情况会爆掉,需要特判。

怎样快速求 \(s1, s2\)?这是一个经典问题,可以参考这道题的思路。

时间复杂度 \(\text O (n \log n)\)

posted @ 2026-01-30 21:32  yemuzhe  阅读(2)  评论(0)    收藏  举报