1 条题解
-
0
📝 题目大意
数轴上有两个区间 和 ,分别被涂成红色和蓝色。求两个区间重叠部分的长度(即同时被两种颜色涂色的部分)。
💡 解题思路
-
题目分析:两个区间均为左闭右开区间(端点处不重叠视为无交集,如样例 3)。数据范围 极小,但解法本身是 的公式,与数据范围无关。
-
算法推导:
- 两个区间交集 的左端点一定是 两者左端点的最大值,即
left = max(L1, L2);右端点一定是 两者右端点的最小值,即right = min(R1, R2)。 - 若
right > left,则交集长度为right - left;否则两区间无交集(相离或仅相邻),长度为 。 - 综上,答案为 。
- 两个区间交集 的左端点一定是 两者左端点的最大值,即
-
边界与细节:
- 区间是左闭右开的:
right - left直接就是长度,无需额外 。 - 两个区间恰好相邻(如 和 )时,
min(R1,R2) - max(L1,L2) = 3 - 3 = 0,max(0, 0)仍为 ,符合题意。 - 一个区间完全包含另一个区间时,公式自然得到被包含区间的长度,无需特殊处理。
- 易错点:不要写成
max(0, right - left + 1),这会将相邻区间误判为重叠。
- 区间是左闭右开的:
⏱️ 复杂度分析
- 时间复杂度:,仅进行常数次比较和算术运算。
- 空间复杂度:,仅使用几个整数变量。
💻 标准代码 (C++)
#include<bits/stdc++.h> using namespace std; int main(){ int L1, R1, L2, R2; cin >> L1 >> R1 >> L2 >> R2; // 交集左端点 = 两者左端点的最大值 int left = max(L1, L2); // 交集右端点 = 两者右端点的最小值 int right = min(R1, R2); // 若 right <= left 则无交集,与 0 取 max 确保非负 int ans = max(0, right - left); cout << ans << endl; return 0; } -
- 1
信息
- ID
- 620
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者