VP 2024 CCPC 哈尔滨
2024 China Collegiate Programming Contest (CCPC) Harbin Onsite (The 3rd Universal Cup. Stage 14: Harbin)
比赛链接
Problems | AC | Note |
---|---|---|
A. Build a Computer | ⊕ | 构造、拆数位 |
B. Concave Hull | ⊕ | 凹包 |
C. Giving Directions in Harbin | ○ | |
D. A Simple String Problem | 字符串、后缀数组、不可做 | |
E. Marble Race | ⊕ | 可撤销背包、多项式 |
F. 1D Galaxy | 不可做 | |
G. Welcome to Join the Online Meeting! | ○ | |
H. Subsequence Counting | 不可做 | |
I. A Brand New Geometric Problem | DP、质因子分解 | |
J. New Energy Vehicle | ○ | 铜牌题、贪心 |
K. Farm Management | ○ | |
L. A Game On Tree | ⊕ | 树上问题、期望、拆贡献 |
M. Weird Ceiling | ○ |
M
1 | void solve() { |
G
1 | void solve() { |
K 二分
按 w 从大到小排序,枚举操作的 i。那么比这个收益小的都卡底线。收益大的是一段前缀,二分这个前缀就做完了。
1 | void solve() { |
L TreeDP、期望
首先期望是假的,算总收益再除去方案数即可。
考虑拆下这个期望,平方拆开来是每个数的平方加上选两个项乘起来。
$$
\left(\left|e_1\right|+\left|e_2\right|+\ldots+\left|e_k\right|\right)^2=\sum_{i=1}^k\left|e_i\right|^2+\sum_{1 \leq i, j \leq k}\left|e_i\right| \cdot\left|e_j\right|
$$
这里的 $e_i$ 均为 $1$。
一种选法的贡献可以分为两种:
- 一种是由公共边 $e_i$ 产生的
- 一种是由有序对 $(e_i, e_j)$ 产生的
不妨设 $siz[u]$ 为 $u$ 的子树大小,$sum[u] = \sum_{v \in subtree_u}{(siz[v])^2}$。
分别讨论下这个贡献怎么算就行了,sol 写的很清楚了不再赘述
1 | void solve() { |
A 构造
唉唉 VP 的时候被这个痛苦折磨。构造解的时候不应该想着具体化的最优策略,应该好好想想形式化的表述的
1 | void solve() { |
E 可撤销背包、多项式
$m$ 个球,速度为 $v_i$ , $n$ 个位置 $x_1, \cdots , x_n$ ,每个球都会随机选择一个位置,然后向正方向移动,求坐标中位数在原点的期望时间,对 $10^9 + 7$ 取模
$n, m \le 500$
设 $m = O(n)$,可能的时间答案一定是某个 $t = \frac{x_i}{v_j}$,那么一共有 $n \cdot m$ 个 $t$,对于每个 $t$,求恰好有 $\lfloor \frac{m}{2} \rfloor$ 个球还没经过原点的概率
对于每个球,可以枚举所有位置,计算出在 $t$ 时没经过原点的概率 $p_i$,经过原点的概率 $1-p_i$。求恰好有 $\lfloor \frac{m}{2} \rfloor$ 个球还没经过原点的概率,这东西是可以背包的。这样的复杂度是 $O(n^4)$。
实际上状态数量并没有那么多,看起来有 $O(n^3)$ 个 $p_i$ ($n^2$ 个 $t$ 和 $n$ 个球),实际上对于每个球,假如我们将 $O(n^2)$ 个 $t$ 从小到大排序,并从小到大枚举这个 $t = \frac{x_i}{v_j}$,对于这个 $t$,只有对应的 $p_j$ 会发生改变,而其他的球都不会发生改变,也就是说实际上就 $O(n^2)$ 个状态。并且我们可以维护所有球的 $dp$ 数组,当某个球发生改变时,撤销那个球,然后把概率变化后的新球加上去。
更进一步地,根据可撤销背包的知识,我们知道单次的可撤销背包对应除一个单项式。我们可以将每个球看作 $p_i\cdot x + (1 - p_i)$,求的是生成函数的 $x^{m / 2}$ 项的系数。
1 | void solve() { |
VP 2024 CCPC 哈尔滨