Pinely Round 3 (Div. 1 + Div. 2)
内容提要
A. 独特按钮:给定一组点,确定是否可以通过只能向三个方向移动来到达所有点。B. 取模几乎相等:给定一个数组,找到一个值,使得在取其他值的模之后,至少有两个值不同。C. 重量区间:给定一组区间和相应的权重,重新排列区间以使权重乘以区间长度的总和最小化。D. 分割加K:给定一个初始数组,重复选择一个值并添加给定的常数,然后将其分割成两个部分。找到使数组中所有值相等所需的操作次数。
延伸解读
题目A的几何条件解析
题目A要求从原点出发,只使用三个方向移动到达所有给定点。文章指出,只需检查所有点是否都位于两个相邻的象限内。这是因为如果点分布在三个或四个象限,则至少需要四个方向才能覆盖。该条件等价于存在一个方向未被使用,即所有点的x或y坐标不出现正负同时存在的情况。代码通过标记四个方向是否被需要来判断。
题目B的二进制思路
题目B要求选择一个模数,使得数组元素取模后至少有两个不同的结果。文章从二进制角度分析,找到所有数中最低的不同位,然后取比该位对应的2的幂稍大的数作为模数。代码从k=2开始不断倍增,直到取模后的集合大小大于1。这种方法保证了模数尽可能小,且能区分至少两个数。
题目C的贪心匹配策略
题目C要求重新排列区间端点和权重数组,使得权重乘以区间长度的总和最小。文章指出,应将最大的权重与最小的区间长度匹配。为了在总长度不变的情况下使区间长度差异最大,算法从大到小遍历右端点,为每个左端点找到最小的可行右端点,从而得到一组长度。然后将长度排序,与排序后的权重反向相乘求和。
题目D的数学推导与操作次数
题目D允许每次选择一个值加上k并拆分为两个,目标使所有值相等。文章通过设定最终值m,推导出a_i - k = t_i * (m - k),其中t_i是正整数。由于所有i的m - k相同,因此m - k必须是所有a_i - k的最大公约数的约数。为了最小化操作次数,应取m - k为最大公约数,然后计算每个a_i需要的拆分次数。
Q&A
Pinely Round 3 的 A 题 Distinct Buttons 要求判断什么?
给定一组点,判断是否可能只往三个方向移动的情况下,到达所有给出的点位,不需要按照顺序。
A 题 Distinct Buttons 的解题思路是什么?
检查所有点是否都位于两个相邻的象限内。
B 题 Make Almost Equal With Mod 的解题思路是什么?
从二进制角度看,找到最后一位大家都不一样的,然后取比它大一点的那个 2^n 即可。
C 题 Heavy Intervals 的目标是什么?
重新排列每个区间的 l, r 以及数组 c,使得 sum_{i=1}^n c_i * (r_i - l_i) 最小。
C 题 Heavy Intervals 的解题思路是什么?
让最大的 c 去匹配最小的区间,从大到小遍历 r 去找对应第一个匹配的 l。
D 题 Split Plus K 的解题思路是什么?
假设最终值为 m,推导出 a_i - k = t_i * (m - k),因此 m - k 可以是所有 (a_i - k) 的最大公约数。