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  阅读(127)  评论(0)    收藏  举报