RE70pts求调
查看原帖
RE70pts求调
1529697
Xian__0609520楼主2025/8/5 15:16

rt

#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 5e5 + 5;
struct Line {
	int l, r, len;
} a[N];
int n, m, ans = 0x3f3f3f3f, ok;
int tmp[N << 1];
inline bool cmp(Line x, Line y) {
	return x.len < y.len;
}
struct Segment {
	struct Node {
		int tag, mx;
	} tr[N << 3];
	inline void add(int k, int v) {
		tr[k].mx += v;
		tr[k].tag += v;
	} 
	inline void pushdown(int k) {
		if (!tr[k].tag) return ;
		add(k << 1, tr[k].tag);
		add(k << 1 | 1, tr[k].tag);
		tr[k].tag = 0;
	}
	inline void pushup(int k) {
		tr[k].mx = max(tr[k << 1].mx, tr[k << 1 | 1].mx);
	}
	inline void modify(int k, int l, int r, int L, int R, int v) {
		if (l >= L && r <= R) return add(k, v), void();
		int mid = (l + r) >> 1;
		pushdown(k);
		if (mid >= L) modify(k << 1, l, mid, L, R, v);
		if (mid < R) modify(k << 1 | 1, mid + 1, r, L, R, v);
		pushup(k);
	}
} T;
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m;
	for (int i = 1, l, r; i <= n; i++) {
		cin >> l >> r;
		a[i] = {l, r, r - l};
		tmp[2 * i - 1] = l, tmp[2 * i] = r;
	}
	sort(tmp + 1, tmp + 1 + 2 * n);
	int tot = unique(tmp + 1, tmp + 1 + 2 * n) - (tmp + 1);
	for (int i = 1; i <= n; i++) {
		a[i].l = lower_bound(tmp + 1, tmp + 1 + 2 * n, a[i].l) - tmp;
		a[i].r = lower_bound(tmp + 1, tmp + 1 + 2 * n, a[i].r) - tmp;
	}
	sort(a + 1, a + 1 + n, cmp);
	int l = 1, r = 1;
	for (; r <= n; r++) {
		T.modify(1, 1, tot, a[r].l, a[r].r, 1);
		int len1 = a[r].len, len2 = 0, chk = 0;
		while (T.tr[1].mx >= m && l < r) {
			ok = 1;
			chk = 1;
			T.modify(1, 1, tot, a[l].l, a[l].r, -1);
			len2 = a[l].len;
			l++;
		} 
		if (chk) ans = min(ans, len1 - len2);
	}
	if (ok) cout << ans;
	else cout << -1;
	return 0;
}
2025/8/5 15:16
加载中...