AtCoder Beginner Contest 395

ABC395

Resources

比赛实况(含讲解)

草稿

Submission (A~E)

Submission for A

Submission for B

Submission for C

Submission for D

Submission for E

F Solution

如果只有第一个限制,那么求出 minHi(下文用 Hm 代替),将所有 Hi>Hm 的都修剪一下就好了。

如果只有第二个限制,可以用优先队列,将所有 Ui 扔到队列中,每次取出最短的牙齿(设其为 Up),然后检查这个牙齿相邻的两个牙齿 Up1Up+1,检查它们是否满足 Up1Up+XUp+1Up+X(显然 Up1,Up+1>Up)。如果不满足,例如 Up1>Up+X,那么令 Up1Up+X

可以证明这个修剪是必要的:因为不可能存在一种合法情况满足 Up1>Up+X,说明 Up1 一定要被修剪。

当然,更新完之后要把这些修剪后的牙齿塞回优先队列。显然,每个 Ui 最多只会被塞入队列 3 次(初始化、被左边的牙齿更新、被右边的牙齿更新)。时间复杂度是 O(nlogn)。至此,就解决完第二个限制了。

我们考虑在第二个限制的基础上加上第一个限制。假设所有牙齿已经被上述过程修剪过了(称为第一次修剪),我们得到了序列 {Ui}。此时求出 HiHm。可以证明,Hm 就是题目所说的 H。证明如下:

如果 i,UiHm,那么我们只需要把 Di 减少即可。

否则,存在一些位置 i 满足 Ui>Hm,我们只需要把这些位置的牙齿修剪即可 UiHm,Di0(称为第二次修剪)。我们得到一个新的序列 {Ui}

第二次修剪是否会破坏第二个限制呢?答案是不会的。

反证法。假设第二次修剪导致第二个限制被破坏了,即,存在某个 i,在它被修剪后,它和相邻的牙齿高度差大于 X

  1. Ui1>Ui+X=Hm+X:不可能,因为第二次修剪后,所有 Ui 都应该小于等于 Hm
  2. Ui1<UiX=HmX:不可能,因为假设不等式成立,说明 i1 没有在第二次修剪被剪掉,即 Ui1=Ui1。我们知道 UiUi1>X,则有 X<UiUi1=UiUi1UiUi1。但我们知道第一次修剪后有 |UiUi1|X,矛盾。

我们证明了第二次修剪保持了第二个限制的成立性,并且保证了第一个限制的成立,故此构造是合法的。

Submission for F

G Solution

还是考虑用最小斯坦纳树的算法。

此算法求出了 f(i,S) 表示以 i 为根,包含集合 S 内所有节点的最小斯坦纳树的代价。空间大小是 O(N2K)

假设只有 1,2,,K,si,那么直接回答 f(si,[K]) 即可,其中 [K] 表示包含 1,2,,K 的全集。问题在于本题是 1,2,,K,si,ti

不难注意到 N 比较小(N80),那么可以考虑一个更大的集合 U

U={(S,k)S[K],k{0,K+1,K+2,,N}}

二元组 (S,k) 表示 S 集合和 k 号节点在最小斯坦纳树上,当 k 等于 0 时表示只有 S 在最小斯坦纳树上。可以发现这个集合的大小是 O(2KN) 的。最后仍然使用 f(i,S) 设计 dp 状态,保证 SU 即可。状态空间的大小是 O(N22K) 的。回答的时候只需要回答 f(si,([K],ti))

最后分析时间复杂度,大概是 O(N2K×NlogN+N23K) 的。

Submission for G

posted @   lingfunny  阅读(57)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示