2024“钉耙编程”中国大学生算法设计超级联赛(1) 模拟总结
2024“钉耙编程”中国大学生算法设计超级联赛(1) 模拟总结
A 循环位移
知识点
简单 Hash。
代码
Source code - Virtual Judge (vjudge.net)。
B 星星
知识点
背包,小体积多重背包优化。
分析
本题直接 \(O(\sum nk)\) 也可以卡过,但是这不是正解。
对于小体积多重背包,我们有一个基于期望的经典优化(官方题解说的经典):
- 打乱物品顺序,防止故意构造。
- 假设我们已经选择了其中 \(i\) 种物品,我们会期望获得 \(E = \frac{iK}N\) 个,那么我们就在这附近暴力 DP 即可。
- 设物品的可选取数最大为 \(V\)。
- 则更新区域大小至少为 \(B = V\sqrt{K}\)。
- 即更新区域为 \([E-B,E+B]\)。
复杂度为 \(O(NV\sqrt{K})\),在这题里是 \(O(\sum n\sqrt{k})\)。
代码
Source code - Virtual Judge (vjudge.net)。
C 树
知识点
线段树合并,启发式合并,树上启发式合并。
分析
分成两部分即可。
代码
Source code - Virtual Judge (vjudge.net)。
D 传送
知识点
线段树分治,可撤销的 DSU,带标记的 DSU。
分析
首先线段树分治是很明显的,但是我们如何记录值呢?
注意到启发式或者按秩合并的 DSU 都是树形结构,我们可以打上标记。
- 连接的时候:(\(u\) 为子节点,\(v\) 为父节点,下同)将 \(tag_u \gets tag_u - tag_v\)。
- 断开的时候:将 \(tag_u \gets tag_u + tag_v\)。
这两步就类似差分。
代码
Source code - Virtual Judge (vjudge.net)。
E 博弈
知识点
组合数学。
分析
先考虑偶数情况,发现如果平局概率为 \(p\),那么答案就为 \(\frac{1-p}{2}\)。
推广到奇数情况,发现如果平局概率为 \(p\),那么答案就为 \(\frac{1+p}{2}\)。
代码
Source code - Virtual Judge (vjudge.net)。
F 序列立方
知识点
计数 DP。
分析
把问题转化成:三个相同的数列,分别取出一个子序列,有多少种可能相同。
那么我们有 \(f_{i,j,k}\) 表示三个数列最后一个分别取出 \(i,j,k\),有多少种可能相同。
则 \(f_{i,j,k} = [a_i=a_j=a_k]\sum_{a<i,b<j,c<k}f_{a,b,c}\)。
那么前缀和优化即可。
代码
Source code - Virtual Judge (vjudge.net)。
G 三元环
知识点
三维偏序,CDQ 分治,容斥,组合数学。
分析
发现图是一张竞赛图,而三个点对无非就是成环或者其中一个向另外两个连边,我们考虑容斥:用所有情况减去后者,那么三维偏序即可。
代码
Source code - Virtual Judge (vjudge.net)。
H 位运算
知识点
位运算。
分析
每一位可以拆开……
代码
Source code - Virtual Judge (vjudge.net)。
I 数位的关系
知识点
数位 DP。
分析
首先把无限制的求出来,然后把前面有限制的拼上就好。
代码
Source code - Virtual Judge (vjudge.net)。
J 众数
知识点
笛卡尔树。
分析
由于数列随机生成,且题目与区间最大值有关,可以想到笛卡尔树,只是可能有重复,不能建出树。
我们假设可以建出笛卡尔树,由于序列随机,从笛卡尔树的结构可以看出,众数大概率是区间中较大的几个值。
那么对于正解我们只要用类似笛卡尔树的做法找出前 \(K\) 的扔到堆里即可。
代码
Source code - Virtual Judge (vjudge.net)。
K 树上的 mex
知识点
线段树,二分,扫描线,DFN。
分析
考虑二分答案,二分到 \(k\) 表示:\(\operatorname{mex}\le k\) 是否有合法解,那么将值 \(< k\) 的点都收集起来更新。
考虑将路径转成二位平面上的点对 \((x,y)\),检验的时候就变成了用值 \(<k\) 的点进行覆盖。
再考虑对值相同的点拉出来建虚树,那么每个点的贡献就是在原树上的儿子减去虚树上的儿子。
然后扫描线即可检验。
代码
Source code - Virtual Judge (vjudge.net)。
L 并
知识点
差分、前缀和,组合数,期望。
分析
我们考虑离散化,在差分统计出每一块被几个矩形覆盖 \(cnt_{i,j}\),接着在统计被覆盖 \(i\) 次的总面积 \(sum_i\)。
那么对于 \(k\),答案就为:
代码
Source code - Virtual Judge (vjudge.net)。

浙公网安备 33010602011771号