比赛 树形数据结构进阶(再进阶) 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 区间 最终得分 100
用户昵称 OTTF 运行时间 3.698 s
代码语言 C++ 内存使用 7.58 MiB
提交时间 2025-04-19 09:44:30
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <vector>

using namespace std;

int n;
int m;
vector<pair<int, int> > nums;
vector<int> magic;
int tree[4000010];
int maxn[4000010];
int res = 1e9;

bool cmp (pair<int, int> one, pair<int, int> two) {
    return one.second - one.first < two.second - two.first;
}

void ParseIn () {
    
    freopen ("interval.in", "r", stdin);
    freopen ("interval.out", "w", stdout);
    
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int l, r;
        cin >> l >> r;
        nums.push_back(make_pair (l, r));
        magic.push_back(l);
        magic.push_back(r);
    }
    sort (nums.begin(), nums.end(), cmp);
    sort (magic.begin(), magic.end());
    magic.erase(unique(magic.begin(), magic.end()), magic.end());
    for (int i = 0; i < n; i++) {
        nums[i].first = lower_bound (magic.begin(), magic.end(), nums[i].first) - magic.begin();
        nums[i].second = lower_bound (magic.begin(), magic.end(), nums[i].second) - magic.begin();
    }
    
}

inline int lson (int now) {
    return now * 2;
}

inline int rson (int now) {
    return now * 2 + 1;
}

void add (int l, int r, int now, int nowl, int nowr, int num) {
    if (l <= nowl && nowr <= r) {
        tree[now] += num;
        maxn[now] += num;
        return;
    }
    int mid = (nowl + nowr) / 2;
    if (l <= mid) {
        add (l, r, lson (now), nowl, mid, num);
    }
    if (r > mid) {
        add (l, r, rson (now), mid + 1, nowr, num);
    }
    maxn[now] = max (maxn[lson (now)], maxn[rson (now)]) + tree[now];
}

void Core () {
    
    int i = 0;
    int j = 0;
    while (true) {
        while (maxn[1] < m && i < n) {
            add (nums[i].first, nums[i].second, 1, 0, magic.size(), 1);
            i++;
        }
        if (i == n && maxn[1] < m) {
            return;
        }
        while (maxn[1] >= m && j < n) {
            add (nums[j].first, nums[j].second, 1, 0, magic.size(), -1);
            j++;
        }
        res = min (res, magic[nums[i - 1].second] - magic[nums[i - 1].first]
                      - magic[nums[j - 1].second] + magic[nums[j - 1].first]);
        if (i == n) {
            return;
        }    
    }
    
}

void CWriteOut () {
    
    if (res == 1e9) {
        cout << -1 << endl;
        return;
    }
    
    cout << res << endl;
    
}

int main () {

    ParseIn ();
    Core ();
    CWriteOut ();    
    
    return 0;
}