玄关求调
  • 板块P10059 Choose
  • 楼主__Refine__
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/26 09:43
  • 上次更新2024/10/26 12:11:11
查看原帖
玄关求调
547787
__Refine__楼主2024/10/26 09:43
#include<bits/stdc++.h>

using namespace std;

int t,n,k,stin[100005][21],stax[100005][21],lg[100005],diff;
inline void pre()
{
	for(int i=1;i<=lg[n];i++)
	{
		for(int j=1;j<=n-(1<<i)+1;j++)
		{
			stin[j][i]=min(stin[j][i-1],stin[j+(1<<(i-1))][i-1]);
			stax[j][i]=max(stax[j][i-1],stax[j+(1<<(i-1))][i-1]);
		}
	}
}
inline bool panduan(int x)
{
	int dif=0x7fffffff;
	for(int i=1;i<=n-x+1;i++)
	{
		int x=i,y=i+(n-x);
		dif=min(dif,max(stax[x][lg[y-x+1]],stax[y-(1<<lg[y-x+1])+1][lg[y-x+1]])-min(stin[x][lg[y-x+1]],stin[y-(1<<lg[y-x+1])+1][lg[y-x+1]]));
	}
	if(dif>=diff) return 1;
	else return 0;
}
int main()
{
	cin>>t;
	while(t--)
	{
		memset(stin,0,sizeof(stin));
		memset(stax,0,sizeof(stax));
		cin>>n>>k;
		lg[0]=-1;
		for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
		for(int i=1;i<=n;i++) scanf("%d",&stin[i][0]),stax[i][0]=stin[i][0];
		diff=0x7fffffff;
		pre();
		for(int i=1;i<=k;i++) {
			int x=i,y=i+(n-k);
			diff=min(diff,max(stax[x][lg[y-x+1]],stax[y-(1<<lg[y-x+1])+1][lg[y-x+1]])-min(stin[x][lg[y-x+1]],stin[y-(1<<lg[y-x+1])+1][lg[y-x+1]]));
		}
		int l=1,r=n-k+1;
		int ans=0;
		while(l<r)
		{
			int mid=(l+r)>>1;
			if(panduan(mid)) r=mid;
			else l=mid+1;
		}
		cout<<diff<<" "<<r<<endl;
	}
	return 0;
}
2024/10/26 09:43
加载中...