[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;
}