求调
  • 板块P10059 Choose
  • 楼主seahorizon
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/4 20:12
  • 上次更新2024/10/4 22:42:51
查看原帖
求调
598799
seahorizon楼主2024/10/4 20:12
#include<bits/stdc++.h>
using namespace std;
#define N 100001
#define ll long long
int n,k;
int st1[N][101],st2[N][101];
int logg[N];
ll x=1e11;
void init()
{
	logg[1]=0;logg[2]=1;
	for(int i=3;i<=n;i++)
	logg[i]=logg[i/2]+1;
	for(int j=1;j<=21;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
		st1[i][j]=max(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);
	for(int j=1;j<=21;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
		st2[i][j]=min(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);
}
ll querymax(int l,int r)
{
	int s=logg[r-l+1];
	return max(st1[l][s],st1[r-(1<<s)+1][s]);
}
ll querymin(int l,int r)
{
	int s=logg[r-l+1];
	return min(st2[l][s],st2[r-(1<<s)+1][s]);
}
bool check(ll mid)
{
	ll res=0;
	for(int i=1;i+mid-1<=n;i++)
	{
		if(querymax(i,i+mid-1)-querymin(i,i+mid-1)>=x)
		res++;
	}
	//cout<<"mid="<<mid<<' '<<"res="<<res<<endl;
	return res>=k;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		memset(st1,-0x9f,sizeof st1);
		memset(st2,0x9f,sizeof st2);
		scanf("%d%d",&n,&k);
		for(int i=1;i<=n;i++)
		{
			scanf("%d",&st1[i][0]); 
			st2[i][0]=st1[i][0];
		}
		init();
		//for(int i=1;i<n;i++) cout<<st1[i][1]<<' ';
		//cout<<querymax(3,5)<<endl;
		for(int i=1;i+n-k<=n;i++)
		{
			//cout<<i<<' '<<i+n-k<<' '<<querymax(i,i+n-k)<<' '<<querymin(i,i+n-k)<<endl;
			x=min(querymax(i,i+n-k)-querymin(i,i+n-k),x);
		}
		printf("%lld ",x);
		ll l=1,r=n-k+1,ans=0;
		//cout<<"res2="<<check(2)<<endl;
		
		while(l<=r){
			int mid=(l+r)>>1;
			if(check(mid)) 
				r=mid-1,ans=mid;
			else l=mid+1;
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2024/10/4 20:12
加载中...