​传送门​

题意: 求最小的l , r 使区间极差大于d

二分出一个长度 , 单调队列维护一个最大,一个最小


#include<bits/stdc++.h>
#define N 1000050
using namespace std;
struct Node{int x,y;}a[N];
int q1[N],q2[N],n,d;
bool cmp(Node a,Node b){return a.x<b.x;}
bool check(int len){
int h1,h2,t1,t2;
h1=h2=1,t1=t2=0;
for(int i=1;i<=n;i++){
while(h1<=t1 && a[i].y <= a[q1[t1]].y) t1--;
q1[++t1] = i;
while(h2<=t2 && a[i].y >= a[q2[t2]].y) t2--;
q2[++t2] = i;
while(h1<=t1 && a[q1[t1]].x - a[q1[h1]].x > len) h1++;
while(h2<=t2 && a[q2[t2]].x - a[q2[h2]].x > len) h2++;
if(a[q2[h2]].y - a[q1[h1]].y >= d) return 1;
}return 0;
}
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].x,&a[i].y);
}
sort(a+1,a+n+1,cmp);
int l=1 , r=N;
while(l<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid+1;
}printf("%d",(l==N?-1:l)); return 0;
}