「赛后总结」暑假 CSP 模拟赛系列
点击查看目录
目录
啥也不会。
对于我这种低水平选手来说补完所有题是比较困难的,写完所有题解更是困难,所以打算只写个人认为比较有意义的题。
都是校内题库的链接。
有 CF/AT 的 submission 的话会考虑直接放提交记录以减少文章长度。
20230728(fengwu round)
感谢彭师傅不斩之恩,做了一圈就彭师傅的最简单。
T3 Count Multiset
题解通道关了
但是:
赛时爆标了。
首先为了方便,先不考虑相同元素出现次数的限制。
我们设 \(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)\) 解决。
T4 Julia the snail
有空写一下吉司机线段树学习笔记。
离线。我们设 \(ans_i\) 表示当前以 \(i\) 为左端点的区间的答案,不断移动右端点。
考虑将右端点从 \(r - 1\) 移动到 \(r\) 会有什么影响。
假设 \(l\) 是以 \(r\) 为右端点的线段的左端点,影响显然是对于 \([1, l]\) 中所有满足 \(a_i \ge l\) 的 \(i\),令其 \(a_i = r\)。
发现是比较后赋值。吉司机线段树,启动!
20230730(ZZ作者 round)
T3 数组
观察欧拉函数式子:
\[\phi(n) = n\prod_{p\in\mathbb{P}, p|n}\frac{p - 1}{p} \]那么我们要维护的就是区间积和区间积的质因数。前者随便维护,考虑后者。
观察数据范围,值域在 300 以内,300 以内恰好有 62 个质因数,考虑状压到一个 long long
里边即可。
预处理逆元和每个数的质因数状态会跑的飞快。
T4 树
根号分治典中典!但是我还没补完!
20230731(Max_QAQ round)
什么 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
?什么离谱题?
你观察数据范围发现数据随机,于是你考虑瞎写。
线段树维护,每个节点维护其代表的区间的宝石能组成的每种价值,考虑使用 vector
和 pair
维护每个区间。
查询/向父亲合并时遍历两个 vector
,对原有的价值区间和新组合出来的价值区间去重。
理论上随便卡卡就会 TLE/MLE,但是出题人的随机数据成功把复杂度降到了 \(O(可过)\)。
20230801(letitdown round)
蚌。
整活大师叉哥,/bx
T2 神(eldenring)
考虑 AC 自动机,删去/加入字符串可以直接在其结尾处节点打标记,查询直接在自动机上跑,不断跳 \(\text{fail}\)。
考虑优化。我们发现删去/加入字符串只影响其结尾处节点 \(\text{fail}\) 子树,考虑对 \(\text{fail}\) 树建出 DFS 序列然后树状数组处理,区间修改,单点查询,使用差分。
T4 动(genshin)
考虑设 \(f_u\) 表示从 \(u\) 节点逃离最小代价。转移方程:
\[f_u = \min_{v\text{ is in the subtree of }u} a_ub_v + f_v \]你发现这玩意就是求一堆直线 \(y = b_vx + f_v\) 在 \(x = a_u\) 时的最小值。考虑李超线段树,支持插入查询与合并。
20230802(Max_QAQ round)
四个题三个概率期望,鉴定为:不可做场。
T1 随
假期望典中典!每一位是可以独立计算的,所以你只考虑每一位不在原位的概率。发现每一位概率相等
考虑设 \(f_{i, 0/1}\) 表示交换了 \(i\) 次,\(1\) 是否在原位的概率。