*Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round)

A

发现被算的次数越多在最终答案的占比越小,所以从小到大算即可

B

考虑 mex 的计算过程,从零开始找第一个没有出现的值
于是这样扫一遍,出现超过一次就把多余的加到 \(i+x\) 即可

C1

发现一个人放过幻灯片之后可以安排方案使得他随时再次出来放幻灯片,所以只要判断把每个人按照第一次放的时间排序后是不是排队顺序的一个前缀即可

C2

发现每次修改最多改变两个人的第一次放的时间,使用 set 维护一下
然后把前缀抽象一下,变成第一个人对应且相邻两个人在排队顺序中都相邻,前者容易判断,后者可以维护相邻的人在排队顺序中相邻的个数来判断

D(补)

赛后认真想了几秒钟就秒了,赛时疑似被翻译坑了。
暴力 DP 很简单,但是极其不现实
发现它的限制很好,考虑设 \(fl_{i,j}\) 表示以 \((i,j)\) 为当前最左端点的最大值,\(fr_{i,j}\) 表示以 \((i,j)\) 为当前最右端点的最大值
然后用一堆前后缀最值即可转移

E1

考虑固定了房屋和所选取的服务器,那么花费实际上就是 MST 上的最大边,于是我们将问题放到了树上
考虑对 MST 过程中的连通块 DP(或者说对重构树做树形dp),设 \(f_{i,j}\) 表示第 \(i\) 块内选了 \(j\) 个服务器的最小花费和(注意这里有明显的延迟结算)
那么当两个块都选了服务器时必然不会经过连接的这条边,如果其中一个选了而另一个没选则没选的块里所有房屋都会连接到选择了的块里的任意一个服务器,花费就是连接的这条边的边权
时间复杂度 \(O(n^3)\)

E2(补)

发现每次只要 DP 到连通块大小,那么相当于树形背包,时间复杂度 \(O(n^2)\)
赛时使用了memset所以过不去。

posted @ 2024-10-07 18:15  ax_by_c  阅读(105)  评论(0)    收藏  举报