[POI2010]PIL-Pilots

原题链接

题解

二分枚举答案,然后用单调队列求最大值最小值即可

Code:

#include<bits/stdc++.h>
#define int long long
using namespace std;
void read(int &x)
{
	char ch=getchar();
	int r=0,w=1;
	while(!isdigit(ch))w=ch=='-'?-1:1,ch=getchar();
	while(isdigit(ch))r=(r<<3)+(r<<1)+(ch^48),ch=getchar();
	x=r*w;
}
const int N=3e6+100;
int a[N],minline[N],k,n,maxline[N];
bool check(int x)
{
	memset(maxline,0,sizeof maxline);
	memset(minline,0,sizeof minline);
	int head=0,tail=1,h=0,t=1,minn=INT_MAX;
	for(int i=1;i<=n;i++)
	{
		while(head<=tail&&a[i]>a[maxline[tail]])tail--;
		maxline[++tail]=i;
		while(head<=tail&&i-maxline[head]>=x)head++;
		while(h<=t&&a[i]<a[minline[t]])t--;
		minline[++t]=i;
		while(h<=t&&i-minline[h]>=x)h++;
		if(i>=x)minn=min(minn,a[maxline[head]]-a[minline[h]]);
	}
	return minn<=k;
}
main()
{
	read(k);read(n);
	for(int i=1;i<=n;i++)
		read(a[i]);
	int l=1,r=n,ans;
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(check(mid))l=mid+1,ans=mid;
		else r=mid-1;
	}
	cout<<ans;
	return 0;
}
posted @ 2022-07-06 11:35  Epoch_L  阅读(13)  评论(0编辑  收藏  举报