1 条题解

  • 0
    @ 2024-8-10 20:35:18

    差分,双指针。

    用差分维护覆盖次数,即:d[l]+=1,d[r+1]=1d[l] += 1, d[r + 1] -= 1 表示区间 [l,r][l,r] 都被覆盖一次。

    数据范围较大,使用 mapmap 即可。

    因为数据范围较大,无法直接遍历整个的长度求答案。但是你会发现,这个总的有效区间其实是被分成了两种种类,分别为只被覆盖一次连续区间,被覆盖两次及以上的连续区间。没被覆盖的不考虑。所求为被覆盖两次及以上的区间的最长长度。

    考虑使用双指针,遍历插入的位置。

    思考答案是如何更新的。当 rr 遍历到一个位置,这个位置的覆盖次数 1\leq 1 这个时候可以更新答案(按差分的定义一定会存在这样的位置),意味着我们重新寻找下一个区间。ll 的更新是在从次数 1\leq 1 的位置变为次数 2\geq 2 的位置。

    #include <bits/stdc++.h>
    
    using i64 = long long;
    
    int main() {
        std::ios::sync_with_stdio(false);
        std::cin.tie(nullptr);
    
        int n;
        std::cin >> n;
    
        std::map<i64, int> map;
        for (int i = 0; i < n; ++i) {
            i64 l, r;
            std::cin >> l >> r;
            ++map[l];
            --map[r + 1];
        }
    
        i64 ans = 0, l = 1E18, cur = 0;
        for (auto [r, j]: map) {
            cur += j;
            if (cur > 1) {
                l = std::min(l, r);
            } else {
                ans = std::max(ans, r - l);
                l = 1E18;
            }
        }
        std::cout << ans;
    
        return 0;
    }
    
    • 1

    信息

    ID
    42
    时间
    2000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    88
    已通过
    16
    上传者