记录编号 576422 评测结果 AAAAAAAAAA
题目名称 双倍腹肌量 最终得分 100
用户昵称 GravatarHeSn 是否通过 通过
代码语言 C++ 运行时间 0.614 s
提交时间 2022-10-08 19:06:58 内存使用 4.36 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m, ans;
struct node {
	int x, y;
}a[N];
bool cmp(node u, node v) {
	return u.x < v.x;
}
int p1[N], p2[N];
int h1, l2, t1, r2;  // 1存最大值,2存最小值 
int main() {
	freopen("double_muscle.in","r",stdin);
	freopen("double_muscle.out","w",stdout);
	cin >> n >> m; 
	for(int i = 1; i <= n; i ++) {
		cin >> a[i].x >> a[i].y;   //结构体便于排序 
	}
	sort(a + 1, a + 1 + n, cmp);
	ans = 0x3f3f3f3f;
	h1 = l2 = 1;
	for(int i = 0, j = 0; i <= n; i ++) {   //最外层循环拉左端点 
		while(h1 <= t1 && p1[h1] < i) {
			h1 ++;   //如果队首比左端点小,那么右移
		}
		while(l2 <= r2 && p2[l2] < i) {
			l2 ++;   //因为排序过了,编号小x一定小 
		}
		while(a[p1[h1]].y - a[p2[l2]].y < m && j < n) {
			j ++;
			while(h1 <= t1 && a[p1[t1]].y < a[j].y) {
				t1 --;
			}
			p1[++ t1] = j;
			while(l2 <= r2 && a[p2[r2]].y > a[j].y) {
				r2--;
			}
			p2[++ r2] = j;//更新两个单调队列 
		}
		if(j != n) {
			ans = min(ans, a[j].x - a[i].x);//满足条件 
		}
	} 
	if(ans == 0x3f3f3f3f){ //无解 
		cout << -1 << endl;
		return 0;
	}
	else {
		cout << ans << endl;
	}
}