1 条题解

  • 0
    @ 2026-6-19 10:30:09

    📝 题目大意

    数轴上有两个区间 [L1,R1)[L_1, R_1)[L2,R2)[L_2, R_2),分别被涂成红色和蓝色。求两个区间重叠部分的长度(即同时被两种颜色涂色的部分)。

    💡 解题思路

    1. 题目分析:两个区间均为左闭右开区间(端点处不重叠视为无交集,如样例 3)。数据范围 0Li<Ri1000 \leq L_i < R_i \leq 100 极小,但解法本身是 O(1)O(1) 的公式,与数据范围无关。

    2. 算法推导

      • 两个区间交集 [L1,R1)[L2,R2)[L_1, R_1) \cap [L_2, R_2) 的左端点一定是 两者左端点的最大值,即 left = max(L1, L2);右端点一定是 两者右端点的最小值,即 right = min(R1, R2)
      • right > left,则交集长度为 right - left;否则两区间无交集(相离或仅相邻),长度为 00
      • 综上,答案为 max(0,min(R1,R2)max(L1,L2))\max(0, \min(R_1, R_2) - \max(L_1, L_2))
    3. 边界与细节

      • 区间是左闭右开的:right - left 直接就是长度,无需额外 +1+1
      • 两个区间恰好相邻(如 [0,3)[0,3)[3,7)[3,7))时,min(R1,R2) - max(L1,L2) = 3 - 3 = 0max(0, 0) 仍为 00,符合题意。
      • 一个区间完全包含另一个区间时,公式自然得到被包含区间的长度,无需特殊处理。
      • 易错点:不要写成 max(0, right - left + 1),这会将相邻区间误判为重叠。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅进行常数次比较和算术运算。
    • 空间复杂度O(1)O(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
    上传者