10pts 求调
查看原帖
10pts 求调
1268478
時空楼主2024/7/23 17:04

RT 过了样例

#include <bits/stdc++.h>

#define FstIO ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pb push_back
#define mem(a, v) memset(a, v, sizeof a)
#define pii pair<ll, ll>

using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
 
const ll N = 5e5 + 15, M = 2e6;
const ll mod = 1e9 + 7, mod2 = 998244353;
const ld eps = 1e-6;

ll n, m;

ll Ans = 1e10;

struct node
{
	ll l, r;
}Sec[N];

bool operator < (node a, node b) { return (a.r - a.l) < (b.r - b.l); }

ll p[N << 1], Len;

struct Tree
{
	ll l, r, val, tag;
}T[N << 2];

void pp(ll k)
{
	T[k].val = max(T[k << 1].val, T[k << 1 | 1].val);
}

void pd(ll k)
{
	T[k << 1].tag += T[k].tag,
	T[k << 1 | 1].tag += T[k].tag;
	T[k << 1].val += T[k].tag,
	T[k << 1 | 1].val += T[k].tag;
	T[k].tag = 0;
}

void build(ll k, ll l, ll r)
{
	T[k] = {l, r, 0, 0};
	if (l == r) return ;
	ll mid = (l + r) >> 1;
	build(k << 1, l, mid),
	build(k << 1 | 1, mid + 1, r);
	pp(k);
}

void modify(ll k, ll ql, ll qr, ll v)
{
	ll l = T[k].l, r = T[k].r;
	if (ql == l && r == qr)
	{
		T[k].val += v, T[k].tag += v;
		return ;
	}
	pd(k);
	ll mid = (l + r) >> 1;
	if (qr <= mid) modify(k << 1, ql, qr, v);
	if (ql > mid) modify(k << 1 | 1, ql, qr, v);
	if (ql <= mid && qr > mid) modify(k << 1, ql, mid, v), modify(k << 1 | 1, mid + 1, qr, v);
	pp(k);
}

signed main()
{
//	freopen(".in", "r", stdin);
//	freopen(".out", "w", stdout);

	FstIO; 

	cin >> n >> m;
	for (ll i = 1; i <= n; i ++ )
	{
		cin >> Sec[i].l >> Sec[i].r;
		p[++ Len] = Sec[i].l, p[++ Len] = Sec[i].r; 
	}
//	Len = n << 1;
	sort(p + 1, p + Len + 1);
	Len = unique(p + 1, p + Len + 1) - p - 1;
//	sort(Sec + 1, Sec + n + 1);
	for (ll i = 1; i <= n; i ++ ) 
	{
		Sec[i].l = lower_bound(p + 1, p + Len + 1, Sec[i].l) - p;
		Sec[i].r = lower_bound(p + 1, p + Len + 1, Sec[i].r) - p;
	}
	sort(Sec + 1, Sec + n + 1);
	build(1, 1, Len + 100);
	ll Pos = 1, Root = 1;
	for (ll i = 1; i <= n; i ++ )
	{
		modify(1, Sec[i].l, Sec[i].r, 1);
		while (T[Root].val >= m && Pos <= i)
		{
			Ans = min(Ans, Sec[i].r - Sec[i].l - Sec[Pos].r + Sec[Pos].l);
			modify(1, Sec[Pos].l, Sec[Pos].r, -1); ++ Pos;
		}
	}
	if (Ans == 1e10) cout << "-1\n";
	else cout << Ans << '\n';
}
2024/7/23 17:04
加载中...