传送门
解题思路:用两个单调队列一个维护y的最大值一个维护y的最小值。枚举l,找到最近的r,满足最值之差为d,准确来说是在l~r范围内找到了满足的区间,这样再枚举下一个l',下一个r'一定大于等于r。
#include<bits/stdc++.h>
#define il inline
#define pb push_back
#define fi first
#define se second
#define ms(_data,v) memset(_data,v,sizeof(_data))
using namespace std;
typedef long long ll;
const ll inf=0x3f3f3f3f;
const int maxn=1e5+7;
int q1[maxn],q2[maxn],h1=1,t1,h2=1,t2;
// q1维护最大 q2维护最小 h1为队头,t1位队尾,队列维护的是数组下表
struct node {
int x,y;
} a[maxn];
bool cmp(node t1,node t2) {
return t1.x<t2.x;
}
int n,d;
int main() {
std::ios::sync_with_stdio(0);
cin>>n>>d;
for(int i=1; i<=n; ++i) cin>>a[i].x>>a[i].y;
sort(a+1,a+1+n,cmp);
int ans=inf;
int l=1,r=0;
for(;l<=n;++l){
while(h1<=t1 && q1[h1]<l) h1++; //将下标小于l的删除
while(h2<=t2 && q2[h2]<l) h2++;
while(a[q1[h1]].y-a[q2[h2]].y<d && r<n){
++r;
while(a[r].y>a[q1[t1]].y && h1<=t1) t1--; //删除比它小的
q1[++t1]=r;
while(a[r].y<a[q2[t2]].y && h2<=t2) t2--; //同理
q2[++t2]=r;
}
if(a[q1[h1]].y-a[q2[h2]].y>=d) ans=min(ans,abs(a[q1[h1]].x-a[q2[h2]].x));//更新答案
}
if(ans==inf) cout<<-1<<endl;
else cout<<ans<<endl;
return 0;
}