题解 | #小红的区间构造#

小红的区间构造

https://ac.nowcoder.com/acm/contest/134529/A

自用

D-小红的最佳区间_牛客周赛 Round 143

    我们假设[L, L + k]与[l ,r]区间相交,则有

        · L <= r

        · L + k >= l

    即 l - k <= L <= r。

    故与[l, r]区间相交的[L, L + k]区间的条件是 l - k <= L <= r。

    换句话来说,若l - k <= L <= r,则其会为区间[l, r]的每个点做出一个贡献。

    问最多有多少个给定区间能够与她选择的区间 [L,L+k] 相交,即[1, max]中哪个点的贡献最多。

    对[l ,r]做出贡献是区间修改,同时由于max可能会很大,而所用到的点不会全部覆盖,故进行离散化。

    写完发现其实就是扫描线。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define endl '\n'
const int N = 1e6;
const ll mod = 1e9 + 7;
const int M = 1e8+10;

void solve() {
    int n, k;
    cin >> n >> k;

    vector<ll> l(n), r(n);
    vector<ll> all;
    all.reserve(2 * n);

    for (int i = 0; i < n; ++i) {
        cin >> l[i] >> r[i];
        ll a = l[i] - k;
        ll b = r[i];
        all.push_back(a);
        all.push_back(b + 1);
    }

    sort(all.begin(), all.end());
    all.erase(unique(all.begin(), all.end()), all.end());
    int m = all.size();
    vector<int> diff(m + 1, 0);

    for (int i = 0; i < n; ++i) {
        ll a = l[i] - k;
        ll b = r[i];
        int idx_a = lower_bound(all.begin(), all.end(), a) - all.begin();
        int idx_b = lower_bound(all.begin(), all.end(), b + 1) - all.begin();
        diff[idx_a] += 1;
        diff[idx_b] -= 1;
    }

    int cur = 0, ans = 0;
    for (int i = 0; i < m; ++i) {
        cur += diff[i];
        ans = max(ans, cur);
    }

    cout << ans << endl;
}


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);

    int T = 1;
    // cin >> T;
    while(T--) solve();
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务