1 条题解

  • 0
    @ 2026-8-11 21:51:36

    理解题意

    给定 nn 个区间 [li,ri)[l_i, r_i),找一个最长的连续时间段 [L,R)[L, R),使得至少有 kk 个区间完全包含它。输出最大长度,无解输出 00


    思路

    将学生按左端点 lil_i 升序排序。
    遍历时,前 ii 个学生的 ljlil_j \le l_i,若从中选出 kk 个右端点最大的,它们的最小右端点就是当前能选的最大 RR
    用最小堆维护这 kk 个右端点,堆顶即为 RR,当前候选长度为 RliR - l_i(需满足 R>liR > l_i)。


    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
    
        int n, k;
        cin >> n >> k;
        vector<pair<int, int>> a(n);
        for (auto &p : a) cin >> p.first >> p.second;
    
        sort(a.begin(), a.end());
    
        priority_queue<int, vector<int>, greater<int>> pq;
        long long ans = 0;
    
        for (int i = 0; i < n; ++i) {
            pq.push(a[i].second);
            if ((int)pq.size() > k) pq.pop();
            if ((int)pq.size() == k && pq.top() > a[i].first)
                ans = max(ans, (long long)pq.top() - a[i].first);
        }
    
        cout << ans << '\n';
        return 0;
    }
    
    • 使用AI完善了公式化表达并优化了语言表达
    • 1

    信息

    ID
    12620
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者