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

知识点

线段树合并,启发式合并,树上启发式合并。

分析

\[f(u,v) = \max(A_u,A_v) \times |A_u - A_v| \\ f(u,v) = \max(A_u,A_v) \times (\max(A_u,A_v)-\min(A_u,A_v)) \\ f(u,v) = {\max(A_u,A_v)}^2 - \max(A_u,A_v)\min(A_u,A_v) \\ \]

分成两部分即可。

代码

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\),答案就为:

\[\sum_{t=1} (1-\frac{n-t \choose k}{n \choose k})sum_t \\ \]

代码

Source code - Virtual Judge (vjudge.net)


posted @ 2025-05-13 22:20  Add_Catalyst  阅读(28)  评论(0)    收藏  举报