📌  相关文章
📜  [L, R] 范围内的整数计数不与 [1, R] 中的数字形成任何三角形对(1)

📅  最后修改于: 2023-12-03 15:13:12.074000             🧑  作者: Mango

题目介绍

给定一个整数范围 [L, R],计算出其中有多少个整数不与范围 [1, R] 中的数字形成任何三角形对。

解题思路

我们可以暴力地枚举 [L, R] 范围内的每个数字,并统计每个数字与 [1, R] 中数字组成的三角形对数目。但是,这样的时间复杂度为 $O((R-L+1)^3)$,显然无法通过本题。

我们换一种思路。由于我们只关心与 [1, R] 中的数字是否可以组成三角形,因此可以先将 [1, R] 中的数字单独枚举出来,并按照数字大小从小到大排序。

接着,我们枚举 [L, R] 中的每个数字,并将其与 [1, R] 中的数字依次配对。设当前枚举的数字为 $x$,其在 [1, R] 范围内可以与 $i$ 到 $j$($1 \le i < j \le R$)之间的数字形成三角形,那么 $x$ 在 [i, j]$ 范围内的数字都不会与 [1, R]` 中的数字形成三角形对。所以,我们可以找到 $[1, R]$ 中最大的满足 $i \le j \le x+i-1$ 的 $j$ 值,然后将 $[i, j]$ 中的数字数量统计到答案中。

代码片段

以下是本题的 Python3 代码实现:

def count_triangle_pairs(L: int, R: int) -> int:
    nums = list(range(1, R+1))
    ans, j = 0, 0
    for x in range(L, R+1):
        while j < R-1 and nums[j+1] <= x+j:
            j += 1
        i = max(x, j-R+i+1)
        ans += max(0, j-i+1)
    return R-L+1-ans

代码解析:

  1. 首先,我们将 [1, R] 中的数字单独枚举出来,并排序为 nums 数组。
  2. 接着,我们遍历 [L, R] 中的每个数字,并在 nums 数组中查找最大的 j 值,使得 $i \le j \le x+i-1$。注意,我们可以利用 j 的单调性来优化查找过程。
  3. 我们再根据 $i$ 和 $j$ 的取值,计算出与 $x$ 不能组成三角形的数字数量,并将其加入答案中。
  4. 最后,我们用 $R-L+1$ 减去计数值即可得到最终结果。

该算法的时间复杂度为 $O((R-L+1) \log R)$,空间复杂度为 $O(R)$。