「赛后总结」暑假 CSP 模拟赛系列 1(7.28~7.31)

「赛后总结」暑假 CSP 模拟赛系列 1(7.28~7.31)

点击查看目录

啥也不会。

对于我这种低水平选手来说补完所有题是比较困难的,写完所有题解更是困难,所以打算只写个人认为比较有意义的题。

都是校内题库的链接。

有 CF/AT 的 submission 的话会考虑直接放提交记录以减少文章长度。

20230728(fengwu round)

感谢彭师傅不斩之恩,做了一圈就彭师傅的最简单。

T3 Count Multiset

题解通道关了

但是:

image

洛谷题解

赛时爆标了。

首先为了方便,先不考虑相同元素出现次数的限制。

我们设 \(f_{i, j}\) 表示当前填了 \(i\) 个数,总和为 \(j\) 的方案数。

考虑一种奇妙的转移方式:

  • 向当前序列里加上一个 \(0\),即从 \(f_{i - 1, j}\) 转移过来。
  • 将当前序列全部加 \(1\),即从 \(f_{i, j - i}\) 转移过来。

第一种操作的例子是序列 2 2 3 加上一个 0 得到 0 2 2 3,由 \(f_{3, 7}\) 转移到 \(f_{4, 7}\);第二种操作的例子是 0 0 1 2 整体加 \(1\) 变为 1 1 2 3,由 \(f_{4, 3}\) 转移到 \(f_{4, 7}\)

接下来开始考虑相同元素出现次数的限制。

既然有限制就不能随意加零,那么第一种操作贡献就应该是 \(\sum_{k = 1}^{m}f_{i - k, j}\),但是我们不知道之前的 \(f_{i - k, j}\) 有几个零,这样就不能直接转移。

考虑设一个辅助的 \(g_{i, j}\) 表示当前填了 \(i\) 个数,总和为 \(j\)序列里不含有 \(0\) 的方案数。

\(g_{i, j}\) 很好转移,就是整体加一的情况,从 \(f_{i, j - i}\) 转移过来。

用这个可以很方便地转移 \(f_{i, j}\) 的第一种操作,即 \(\sum_{k = 1}^{m}g_{i - k, j}\)

总结一下转移方程:

\[\begin{aligned} f_{i, j} &= f_{i, j - i} + \sum_{k = 1}^{m}g_{i - k, j}\\ g_{i, j} &= f_{i, j - i} \end{aligned} \]

考虑前缀和优化,\(O(n^2)\) 解决。

AT Submission.

T4 Julia the snail

有空写一下吉司机线段树学习笔记。

离线。我们设 \(ans_i\) 表示当前以 \(i\) 为左端点的区间的答案,不断移动右端点。

考虑将右端点从 \(r - 1\) 移动到 \(r\) 会有什么影响。

假设 \(l\) 是以 \(r\) 为右端点的线段的左端点,影响显然是对于 \([1, l]\) 中所有满足 \(a_i \ge l\)\(i\),令其 \(a_i = r\)

发现是比较后赋值。吉司机线段树,启动!

CF Submission.

20230730(ZZ作者 round)

T3 数组

观察欧拉函数式子:

\[\phi(n) = n\prod_{p\in\mathbb{P}, p|n}\frac{p - 1}{p} \]

那么我们要维护的就是区间积和区间积的质因数。前者随便维护,考虑后者。

观察数据范围,值域在 300 以内,300 以内恰好有 62 个质因数,考虑状压到一个 long long 里边即可。

预处理逆元和每个数的质因数状态会跑的飞快。

CF Submission.

T4 树

根号分治典中典!

步长 \(c\) 小于 \(\sqrt{n}\) 的话考虑树上差分,预处理出来节点 \(u\) 步长为 \(k\) 时走到根经过的点的权值和。

否则直接暴力跳,有人用长链剖分啊但其实没必要,你先一直跳 \(\sqrt{n}\) 级祖先最后跳 \(c\bmod{\sqrt{n}}\) 级祖先就行。

复杂度 \(O(n\sqrt{n})\)

20230731(Max_QAQ round)

image

什么 Cu 的教训。

T3 U

Rolling_star 好强,/bx

观察发现对于 \(k > 2\) 的期望相当于 \(k = 2\) 的期望乘上 \(\dbinom{n-2}{k-2}\),于是只考虑计算 \(k = 2\) 的情况。

首先我们使用经典 trick 边权化点权,然后考虑经过一个点 \(u\) 产生的贡献。

约定 \(a_u\) 表示 \(u\) 的点权,\(sz_u\) 表示 \(u\) 子树大小,\(top_u\) 表示 \(u\) 到根,\(ans_u\) 表示 \(u\) 子树内可以选的点的个数(即到 \(u\) 的路径上没有点权与 \(u\) 相同的点)。

\(a_u, sz_u, top_u\) 比较好算,\(ans_u\) 初始为 \(sz_u\),然后对于每个 \(v\) 都会对 \(ans_{top_v}\) 产生 \(-sz_v\) 的贡献。

预处理完后发现 \(\sum_{u = 1}^n ans_{u}ans_{top_u}\) 即是答案,但是发现根没有权值,所以对于 \(top_u = 0\) 这种情况无法计算。

考虑设 \(w_x\) 表示当根权值为 \(x\) 时的 \(ans\),那么 \(top_u = 0\) 的点 \(u\) 来说,其贡献为 \(ans_{u}w_{a_u}\)

好了。

T4 E

?什么离谱题?

你观察数据范围发现数据随机,于是你考虑瞎写。

线段树维护,每个节点维护其代表的区间的宝石能组成的每种价值,考虑使用 vectorpair 维护每个区间。

查询/向父亲合并时遍历两个 vector,对原有的价值区间和新组合出来的价值区间去重。

理论上随便卡卡就会 TLE/MLE,但是出题人的随机数据成功把复杂度降到了 \(O(可过)\)

posted @ 2023-08-02 16:50  K8He  阅读(212)  评论(4编辑  收藏  举报