Codeforces Global Round 28 / cf contest 2048 题解

比赛链接

A. Kevin and Combination Lock

观察操作
难度(个人感觉)★☆☆☆☆

注意到两个操作都不改变 \(\%33\) 的值,因此要求原数 \(\%33 == 0\), 显然这是充分的。

B. Kevin and Permutation

观察操作
难度(个人感觉) ★☆☆☆☆

一个点的 "势力范围" 是以 \([p, p + k)\) 为右端点的这些区间。从小到大枚举 \(1\)\(n\),从左到右铺满右端点区间 \([k - 1, n)\) 就行,铺不下的数位置随便选。

C. Kevin and Binary Strings

观察操作,优化
难度(个人感觉)★★☆☆☆
其中一个区间是 \([1,n]\) ,否则结果小于 \(2^{n-1}\)
考虑暴力另一个区间,时间复杂度 区间数 * 比较代价 = \(O(N ^ 2) * O(N) = O(N^3)\)
可以要求左端点一定是 \(1\),并且左端点要去异或的位置必须是 \(0\),那么固定右端点时,左端点显然越左越好。那么时间复杂的变成了 \(O(N) * O(N) = O(N ^ 2)\)

D. Kevin and Competition Memories

观察操作,贪心
难度(个人感觉)★★☆☆☆

发现对于一场比赛,排名只和比自己 \(rating\) 高但是题目数一样的人有关,找到第一个自己做不了的题目,\(rank\) 比自己好的即能做这道题的人的人数。

对于每个自己做不了的题目,处理出能做这道题的人数 \(num\)。对于自己能做的题目,可以等价转换为所有人都做不了的题目,把 \(num\) 设为 \(0\)。那么一场比赛的 \(rank\) 即所有题目的 \(num\) 最大值 \(+ 1\)

对每个k,
排序后去除最大的 \(m \% k\) 个值,那么最优 \(rank\) 是第 \(k\) 小,第 \(2k\) 小,. . . , 第 \(\lfloor m / k\rfloor k\) 小的值。容易发现每个值都不可能更优。

E. Kevin and Bipartite Graph

构造
难度(个人感觉)★★★☆☆

通过边的上界,考虑不可行的情况。 上界是 \(n (2n + m - 1)\),后半部分是森林的最大大小,即树的形态。要求连 \(2 * n * m\) 条边,要求 \(2nm \le n(2n + m - 1)\),即 \(m \le 2n-1\)

考虑构造,\(u\)\(v\) 的边,颜色是 \((v - u)\% 2n / 2\)即可。

验证正确性是简单的。为什么这么构造我也不知道(哭)
可以通过 \(m = 2n-1\) 的情况尝试,并且分配要尽可能均衡,那么每种颜色,每个右边的点,建议分配 2 条边。比较合理的想法是循环分配,对于下一个右边点点,建议偏移一格。

F. Kevin and Math Class

笛卡尔树,dp,优化
难度(个人感觉)★★☆☆☆

区间最小值,显然尽可能往 左/右 扩展,建出笛卡尔树。

信息有两个:当前最大值,操作次数,将操作次数作为状态进行 \(dp\) 即可。

注意并不是所有转移都是有用的,我们希望找到最小的 \(max\),那么可以双指针记录操作次数 \(i, j\),每次将 \(max\) 较大的那个部分的操作次数增加,这样 \(max\) 才有可能减少。正确性是显然的,可以发现任意一个 \(x\) 作为 \(max\),我们用的步数都是最少的。如果不做优化,TLE 的可能是不小的

未完待续
posted @ 2024-12-20 16:48  陈聂  阅读(189)  评论(0)    收藏  举报