Loading

数轴上定长区间与给定区间同时相交的最大数量

模型

在[1, n]中给定k个长度不等区间[l, r],求[1, n]中长度为d的区间与给定区间同时相交的最大数量

解法一 排序 + 滑动窗口

int solve(int n, int d, int k, std::vector<PII> &a) {
    std::sort(a.begin(), a.end());
    std::priority_queue<int, std::vector<int>, std::greater<int>> f;
    int max = 0, idx = 0;
    for (int i = 1, j = 1; i <= n; i++) {
        while (idx < k && a[idx].first == i) {
            f.push(a[idx].second);
            idx++;
        }
        while (i - j + 1 > d)
            j++;
        while (f.size() && f.top() < j)
            f.pop();
        max = std::max(max, (int)f.size());
    }
    return max;
}

解法二 相交 = 总数 - 不相交

int solve() {
    int n, d, k;
    std::cin >> n >> d >> k;
    std::vector<int> l(n + 2, 0), r(n + 2, 0);
    for (int i = 1; i <= k; i++) {
        int a, b;
        std::cin >> a >> b;
        l[a]++;
        r[b]++;
    }
    for (int i = 1; i <= n; i++) {
        r[i] += r[i - 1];
    }
    for (int i = n; i >= 1; i--) {
        l[i] += l[i + 1];
    }

    int mx = -1;
    for (int i = 1, j = i + d - 1; j <= n; i++, j++) 
        mx = std::max(l[j + 1] + r[i - 1], mx);

    return mx;
}

posted @ 2024-10-04 11:11  Silverhand_dy  阅读(13)  评论(0)    收藏  举报