比赛 |
树形数据结构进阶(再进阶) |
评测结果 |
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;
}