二分+单调队列 但判断部分不知道为什么会出错
或者求大佬给点简单数据
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
struct node{
int wz,dx; //位置 大小
}mx[1000001],mi[1000001];//双端队列
int mxl=1,mxr,mil=1,mir;//两个双端队列的头尾
int map[1000001],n,d,ans=1e8,maxn=-1;
void jr(int x,int y)//将数据加入双端队列
{
if(y==-1)return;
node z;
z.dx=y;
z.wz=x;
while(mxr>=mxl)
if(mx[mxr].dx<=y)mxr--;
else break;
mx[++mxr]=z;
while(mir>=mil)
if(mi[mir].dx>=y)mir--;
else break;
mi[++mir]=z;
}
bool sd(int sp)//判断花盆长为sp时是否存在
{
for(int i=1;i<=sp+1;i++)jr(i,map[i]);
if(mx[mxl].dx-mi[mil].dx>=d)return true;
for(int i=2;i<=maxn-sp;i++)
{
if(mx[mxl].wz<i&&mxl<=mxr)mxl++;
if(mi[mil].wz<i&&mil<=mir)mil++;
jr(i+sp,map[i+sp]);
if(mx[mxl].dx-mi[mil].dx>=d&&mx[mil].dx!=0&&mi[mil].dx!=0)return true;
}
return false;
}
int main()
{
memset(map+1,-1,1000000);
mx[1].wz=1e8;
mi[1].wz=1e8;
int x,l=1e8,r=-1,mid;
cin>>n>>d;
for(int i=1;i<=n;i++)
{
cin>>x;
maxn=maxn>x?maxn:x;
cin>>map[x];
l=l<map[x]?l:map[x];
r=r>map[x]?r:map[x];
}
//输入
if(r-l<d)
{
cout<<"-1";
return 0;
}//不存在
l=1;
r=maxn-1;
while(true)
{
//cout<<l<<" "<<r<<endl;
for(int i=1;i<=mir;i++)mi[i].dx=0;
for(int i=1;i<=mxr;i++)mx[i].dx=0;
mir=0;mxr=0;
mil=1;mxl=1;
mid=(l+r)>>1;
if(sd(mid))r=mid-1;
else l=mid+1;
if(r<l)break;
}//二分
cout<<r+1;
return 0;
}
/*
8 6
5 3
4 2
7 2
8 1
10 4
50 3
75 2
100 10
2 4
9 1
12 10
2 6
75 2
100 10
*/