只有五分,样例全过求条
  • 板块P10059 Choose
  • 楼主FROGXx
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/2/8 10:55
  • 上次更新2025/2/8 13:31:01
查看原帖
只有五分,样例全过求条
1109877
FROGXx楼主2025/2/8 10:55
#include<bits/stdc++.h>
using namespace std;
long long a[30][100005],b[30][100005],n;
long long quary(long long x1,long long x2){
	long long x=log2(x2-x1+1);
	return max(a[x][x1],a[x][x2-(1<<x)+1])-min(b[x][x1],b[x][x2-(1<<x)+1]);
}
long long ans1=1e18;
int main(){
	long long T,k;
	cin>>T;
	for(long long i=1;i<=T;i++){
		cin>>n>>k;
		memset(a,0,sizeof(a));
		memset(b,0,sizeof(b));
		for(long long i=1;i<=n;i++){
			cin>>a[0][i];
			b[0][i]=a[0][i];
		}
		if(n==k){
			cout<<0<<' '<<1<<endl;
			continue;
		}
		long long len=log2(n);
		for(long long i=1;i<=len;i++){
			for(long long j=1;j<=n-(1<<i)+1;j++){
				a[i][j]=max(a[i-1][j],a[i-1][j+(1<<(i-1))]);
				b[i][j]=min(b[i-1][j],b[i-1][j+(1<<(i-1))]);
			}
		}
		for(int i=1;i<=k;i++){
			ans1=min(ans1,quary(i,n-k+i));
		}
		cout<<ans1<<" ";
		long long lef=1,righ=n-k+1;
		long long mid;
		while(lef<righ){
			mid=(lef+righ)/2;
			long long s=0;
			for(long long i=1;i<=n-mid+1;i++){
				if(quary(i,i+mid-1)>=ans1){
					s++;
					if(s==k){
						break;
					}
				}
			}
			if(s==k){
				righ=mid;
			}else{
				lef=mid+1;
			}
		}
		cout<<lef<<endl;
	}
	return 0;
}
2025/2/8 10:55
加载中...