2024.12.3 CF2042 VP 题解

CF2042A Greedy Monocarp

\(a\) 从大到小排序后,显然一定存在一种最优解,是选择 \(a\) 的一个最长前缀,满足其前缀和不超过 \(k\),增加 \(a_1\) 直到这个前缀和等于 \(k\),增加次数即为答案

因此直接模拟即可,时间复杂度 \(O(\sum n\log n)\),瓶颈在于排序

代码

CF2042B Game with Colored Marbles

在两者都执行最优策略的情况下,一定是 \(A\) 先选一个出现 \(1\) 次的,\(B\) 再选一个出现一次的,重复直到出现一次的选完。这部分总分为 \(2\lceil\frac x2\rceil\),其中 \(x\) 为出现一次的数字数量。对于出现不止一次的,一定是两人分别选至少一次,总贡献为出现不止一次的数字数量

因此直接统计即可,时间复杂度 \(O(\sum n)\)

代码

(不清楚为什么前两题数据范围这么小,一开始 \(B\) 想到正解了,但以为正解为 \(O(\sum n^2)\)\(O(\sum n^2\log n)\) 的,耽误了大约半小时,现在还不知道 \(B\) \(O(\sum n^2)\) 怎么做)

CF2042C Competitive Fishing

若在 \(i\)\(i+1\) 之间新增一个断点,会令 \(B\) 的分数减 \(A\) 的分数的值增加 \(i+1\sim n\)\(1\) 的数量减 \(0\) 的数量

因此将 \(O(n)\) 个按贡献从大到小排序,贪心选择即可

时间复杂度 \(O(\sum n\log n)\)

代码

CF2042D Recommendations

相当于对于每个区间,求出所有能覆盖其的区间的交与原区间的差的长度

显然交为一个线段,因此转化为对于每个区间,求出所有能覆盖其的区间中左端点的最大值和右端点的最小值

可以分别排序后用 set 计算

时间复杂度 \(O(\sum n\log n)\)

代码

CF2042E Vertex Pairs

显然树的重心中一定有至少一个在被选出集合内

令重心为树的根(若有两个则新建一个根,令两重心为其儿子,并去掉两重心之间的边)

考虑先将所有节点插入,再编号从大到小尝试删除

\(x\)\(y\) 的值相同,则 \(lca(x,y)\) 到根的链上所有点都不能删(因为根一定选,因此不能断开)

从大到小考虑所有能删的点,若删除它,则其所在子树内所有点都标记为已删除

若删除了一个点,要标记其对应点(值相同的另一个点)到根的链上所有点为不可删除

可以证明这一算法的正确性

在标记点不可删时,若遇到一个已经删除的点,则说明剩余部分已经标记,直接跳出即可,这样可以保证复杂度

总时间复杂度 \(O(n\log n)\)

代码 参考了 Kitty-Milk

CF2042F Two Subarrays

显然可以用 \(DDP\)

若向量从上到下依次为 \(0\),第一个没选完,第一个选完,第二个没选完,第二个选完,则注意到只有左下角的半个矩形有用,其余全为 \(-\infty\)。因此矩乘时忽略剩余部分,常数可以减少为原来的 \(\frac16\)

代码

posted @ 2024-12-03 13:21  Hstry  阅读(98)  评论(0)    收藏  举报