P9170 填数游戏 贺题记录

感觉进行对于此类困难问题对于我是很有 educational 的意义的。

这个题考虑贺 ZCPB 伟大的 SD 队长的方法。

妈的,考场上写了 B 先 A 后的弱智做法。

Pre - Task

很自然的,考场上我也会的先想到 \(T_{i, 0} \to T_{i, 1}\), 这样有解得方案显然是树或者基环树的若干森林拼起来。

然后我们可以考虑 \(S_i \to S_i \cap T_i\),因为 Alice 显然不会选没啥用的。

A - Task

显然要么是 -1 要么是 0。

怎么判 -1?就是 \(|V| < |E|\)

B - Task

考虑将环上的边定向。

考虑 \(|S_i| = 0\) 这个显然是没有贡献的。

考虑 \(|S_i| = 1\)\(cnt_1\) 为顺时针的贡献, \(cnt_2\) 为逆时针的贡献。

考虑 \(|S_i| = 2\),那么这样 Alice 怎么样都可以产生贡献,那么就是 \(cnt_0\) 的贡献。

那么就是考虑将 \(cnt_0\) 分配给 \(cnt_1\)\(cnt_2\) 后让其最小值最大。

\(cnt_1 + cnt_0 < cnt_2\) 的此类情况显然选择前者更优, Bob 会这样填。

否则,那么我们只能平均地填。

\[\lfloor \frac{cnt_0 + cnt_1 + cnt_2}{2}\rfloor \]

这样才是对 Bob 的最优情况。

  • 基环树

考虑延伸 B-Task 的做法。

树边显然只能选非环点,因为环上的点是已经被选中了的,直接考虑 \(S_i\) 即可。

C - Task

考虑将答案以权值的形式挂在每个点上。

首先树的话 Bob 必须要舍弃掉一个点,然后以该点为根,其它点都会放到父边上。

此时的 \(|S_i| \leq 1\),也就意味着要么该边不会产生贡献,要么只会对单个方向产生贡献。

我们会选择一个根,然后考虑贡献,这个时候是经典结论。

子树内 \(+1\) 以及子树外 \(+1\) 这样显然是取决于对于 \(u\) 的一个选择,这个差分即可。

显然的当 \(u = s_e\) 时,子树外的根迫使他走父边,所以要 +1,那另一种情况同理。

最后我们选择权值最大的作为答案就行了。注意是 A 先 B 后。

D - Task

继续考虑答案以权值的形式挂在每个点上。

这时候有 \(|S_i| = 2\) 的情况,可以对任意方向贡献权值。

考虑这时候先定向了一部分边。那么换了根即 \(u \to v\) 显然是取反了一条边的贡献。

那么我们考虑人类智慧,我们显然要取反若干条边,那么直接弄出树的直径,以中点为根,也就是说直径上的每条边它的贡献都会给两个端点之一,显然 Bob 选择二者中较大的更优,所以答案的下界是, \(\lceil \frac{len}{2}\rceil\)

这个可以考虑画画。

考虑拼起来 C 和 D 两个 task。

\(|S_i| = 2\) 的边弄成 1,把其他的弄成 0,然后再加上 \(w_u\),这样就跑一个最后求出该树的带权直径大小除以二上取整的结果就是答案。

Conclusion

搬运题解都好难啊。然后拼起来 ABCD 就是对的。

题外话 : 2023.4.24 恭喜 Cust10 以 3.84KB 优异长度通过此题。

posted @ 2023-07-02 14:58  Cust10  阅读(23)  评论(0)    收藏  举报