除#1#3全WA玄关求调,有注释
查看原帖
除#1#3全WA玄关求调,有注释
445211
MC_dmAC楼主2024/10/14 13:39

二分+单调队列 但判断部分不知道为什么会出错

或者求大佬给点简单数据

#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
*/
2024/10/14 13:39
加载中...