CF 2172C Circles Are Far from Each Other
首先大致分析一下最后的形态。
因为题目限定了如果圆 \(C_1, C_2\) 都被 \(C\) 包含,那么 \(C_1, C_2\) 也必须成包含关系,这说明 \(C, C_1, C_2\) 会成一个相嵌套的链的关系。
于是可以知道最后的形态一定是数轴上有 \(l'\le l\) 个大圆,其他圆都嵌套在这些圆内部,并且大圆的编号一定要 \(\le l\)。
接下来结合要最大化最小距离来思考大圆间的分布和大圆内部的嵌套关系:
-
对于大圆内的嵌套,可以知道一定是按半径从大到小嵌套的,记为 \(r'_1\ge r'_2\ge \cdots \ge r'_c\)。
考虑 \((i, j) (i < j)\) 的关系,首先 \(j\) 一定被套在 \(i\) 中,那么考虑左侧边界距离和右侧边界距离(最小距离一定是这两个距离中的一个),会发现当 \(i, j\) 圆心相同时两侧距离相同,取到了最小距离。于是嵌套关系中,所有圆的圆心一定是在一起的。
-
对于大圆间的分布,因为前面知道了每个大圆内的圆心是相同的,所以最小距离一定出现在大圆之间。
设有 \(C\) 个大圆,半径分别为 \(R_1 \ge R_2 \ge \cdots \ge R_C\)。
若 \(C = 1\),则大圆随便放;否则会发现若放在所有大圆的两侧,对总距离 \(k\) 的“消耗”只有 \(R_i\),若是放在中间则会“消耗”掉 \(2R_i\),于是一定是 \(R_1, R_2\) 放在两侧,剩余的放在中间。
经过分析,也能得出一个大圆的分配方案的最优解,即为 \(\frac{k - R_1 - R_2 - \sum\limits_{i = 3}^C R_i}{C - 1}\)(当 \(C = 1\) 时认为是 \(\infty\)) 和每一组嵌套内 \(r'_i - r'_{i + 1}\) 的 \(\min\)。
考虑到如果直接确定大圆的位置,那么后一部分的 \(\min\) 是好求的。
这是因为可以直接顺着做,每次都在已有的一些圆上用一个更小的圆替换,并且要最大化两圆半径之差,所以直接替换最大的圆一定不劣(可用调整法证明)。
不过这样的问题是,前半部分的分母分子或许必须要记录下来,这就非常劣了。
对于刚刚的后半部分的求解,考虑用一个更优美的形式来刻画,假设现在在第 \(i\) 个圆,此时已经有 \(j\) 个圆了,且 \(i\) 不是大圆,那么 \(i\) 一定是替换掉第 \(i - j\) 个圆。
这只需要说明此时的 \(j\) 个圆一定就是编号为 \([i - j, i - 1]\) 的圆,可以归纳证明。
考虑到问题具有单调性,\(\le \operatorname{ans}\) 的答案一定都可行,\(> \operatorname{ans}\) 则都不可行。
这启发我们通过二分 \(\operatorname{ans}\) 来求解问题。
二分完还是一样的,前半部分其实并不好直接做,会涉及到很多信息。
所以考虑是让后半部分先满足条件并且最大化前半部分,看前半部分是否满足 \(\ge \operatorname{ans}\)。
那么根据后半部分更优美的刻画,考虑求出对于每个 \(i\),满足 \(r_j - r_i\ge \operatorname{ans}\) 的最大的 \(j\)(认为 \(r_0 = \infty\))。
此时考虑记 \(d_i = i - j\),\(d_i\) 的意义就是,如果 \(i\) 是非大圆,那么此时至少得有 \(d_i\) 个圆 \(i\) 才可以替换。
令 \(d_0 = 0\)。
因为 \(i\) 能替换 \(i + 1\) 才能替换,所以可以令 \(d_{i + 1}\gets \max(d_{i + 1}, d_i)\),这样其实转变成了一个单调不降的序列,并且可以知道 \(0\le d_{i + 1} - d_i\le 1\)。
这是因为考虑 \(i\) 对应的 \(j\),因为 \(r_j - r_i \ge \operatorname{ans}, r_{i + 1}\le r_i\),所以 \(r_j - r_{i + 1}\ge \operatorname{ans}\),那么 \(i + 1\) 时的 \(j\) 不会向前,这也说明 \(j\) 是可以双指针求的。
考虑 \(d_i = d_{i - 1}\) 的位置,因为已经保证了 \(i - 1\) 时有 \(d_{i - 1}\) 个圆了,所以 \(i\) 时一定可以替换,不需要考虑。
考虑 \(d_i = d_{i - 1} + 1\) 的位置,那么此时如果 \(i - 1\) 时还是 \(d_{i - 1}\) 个圆,那么就无法替换,所以此时一定要在 \([1, i]\) 中选一个圆变成大圆。
注意到 \(d_n\) 其实就意味着整个过程需要的大圆数,这是个确定的值,那么当数量确定时,肯定是每个圆尽量靠后,所以这个大圆一定会尽量选到 \(i\)。
不过因为前面说明了大圆编号必须 \(\le l\),所以若 \(i > l\),把前 \(l\) 个中最靠后的非大圆换成大圆一定是最优的决策。
注意当 \(d_n > l\) 时一定不合法,因为大圆数至多为 \(l\)。
以上的步骤都可以 \(\mathcal{O}(n)\) 完成,然后就可以知道此时最优的大圆选取了,代入前半的式子判断与 \(\operatorname{ans}\) 的大小关系即可。
对于最后答案转成分数,可以考虑先实数二分,因为答案的分母是 \(\le n - 1\) 的,所以直接 \(\mathcal{O}(n)\) 枚举分母得出近似分子判断即可。
时间复杂度 \(\mathcal{O}(Tn)\),\(T\) 是二分次数,我设的 \(100\)。

浙公网安备 33010602011771号