A
题意:给出一棵树,断两条边分成三份 \(a, b, c\),最小化 \(\max (a, b, c) - \min(a, b, c)\)。
一个自然的想法是枚举 \(x\),断掉 \((x, fa)\),在剩余部分尽可能均分。
对于不是 \(x\) 祖先的点,找大小最靠近 \(\frac{n - sz_x}{2}\);对于 \(x\) 的祖先,找最靠近 \(sz_x + \frac{n - sz_x}{2}\) 的。submission
另解:随机一个根,启发式合并找子树内 size 内最接近 \(\frac{sz_x}{2}\) 的,对应断 \((x, fa)\) 再在子树内断一刀。效率不会分析。
B
题意:\(1 \sim n\) 顺次排列,每次等概率选出两个相邻的人 \(i, j\),\(i\) 赢的概率为 \(\frac{a_i}{a_i + a_j}\),\(j\) 赢的概率为 \(\frac{a_j}{a_i + a_j}\),赢的人继续留在场上。
求第 \(k\) 个人最后获胜的概率。\(n \le 500\)。
设 \(f(i, j, k)\) 表示只考虑区间 \([i, j]\),\(k\) 获胜的概率。由于不需要考虑每一回合的发生顺序,\(f(i, j, k ) = f(i, k, k)\times f(k, j, k)\)。
不能由上述表达式求出的情况只有 \(f(i, j, i)\) 和 \(f(i, j, j)\),记作 \(l(i, j)\) 和 \(r(i, j)\)。
以 \(l(i, j)\) 为例,肯定是把 \([i + 1, j]\) 拆成若干区间,每个区间的胜者与 \(i\) 比赛,设最后一个区间 \([k, j]\),枚举胜者 \(p\):
最后一个区间长为 \(a\) 且 \(p\) 获胜的概率是多少?不妨先考虑每一回合的顺序,一个人被删除则加到末尾,最后能得到一个排列。
总共 \((j - i)!\) 种排列,先把 \(p\) 放到末尾,剩下 \(j - i - 1\) 个人随便排,概率等于 \(\dfrac{1}{j - i}\),与 \(a\) 无关。
后面一个和式只与 \(i, p\) 有关,dp 同时算一下贡献,做到 \(O(n)\) 转移。时间复杂度 \(O(n^3)\)。submission
C
题意:\(n\) 行 \(m\) 列的网格,左下角为 \((0, 0)\),右上角为 \((m, n)\),保证 \(2\nmid m \land n\perp m\)。
若干格子(非格点)中有方块,给出 \(k\) 个方块的右上角左边。初始位置在 \((\frac{m}{2}, 0)\),初始方向向量 \((-1, 1)\)(左上)。
撞到边界或方块发生反射,一个方块被撞到会立刻消失。求所有方块消失的时刻,数据保证有解。\(n, m, k \le 10^5\)。
能从 \((x_0, y_0)\) 直接撞到一个方块当且仅当 \(x + y\) 或 \(x - y\) 相同,这取决于当前方向,分讨一下。
复杂度瓶颈在于从一个方块到下一个方块有可能经过 \(O(n)\) 个边界点。
如果 \(x, y\) 都是边界点,\(x\) 从这个方向射到 \(y\), 下一次延这个方向还是到 \(y\)。并查集压缩路径,复杂度 \(O(n\log n + n\alpha(n))\)。
代码不会写,码力太弱。
D
题答题: