提交时间:2024-11-03 16:27:21
运行 ID: 34173
#include<bits/stdc++.h> using namespace std; const int N = 5e5+10; int T,n,k,ans,lnog[N],st[2][N][21]; int a[N]; inline void getlog(){ lnog[1]=0; for(int i=2;i<=n;i++){ lnog[i]=lnog[i>>1]+1; } } inline int query(int l,int r){ int i=lnog[r-l+1]; return max(st[1][l][i],st[1][r-(1 << i)+1][i])-min(st[0][l][i],st[0][r-(1 << i)+1][i]); } inline bool check(int x,int y){ int cnt=0; for(int i=1;i<=n-x+1;i++){ if(query(i,i+x-1)>=y){ cnt++; } } if(cnt>=k) return true; else return false; } int main(){ //freopen("choose.in","r",stdin); //freopen("choose.out","w",stdout); scanf("%d",&T); while(T--){ ans=0; scanf("%d %d",&n,&k); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); st[1][i][0]=a[i]; st[0][i][0]=a[i]; } int X=2e9; for(int i=1;(1 << i)<=n;i++){ for(int j=1;j+(1<<i)-1<=n;j++){ st[1][j][i]=max(st[1][j][i-1],st[1][j+(1<<i-1)][i-1]); st[0][j][i]=min(st[0][j][i-1],st[0][j+(1<<i-1)][i-1]); } } getlog(); for(int i=1;i<=k;i++){ if(X>query(i,i+n-k)){ X=query(i,i+n-k); } } printf("%d ",X); ans=n-k+1; int L=1,R=n-k; while(L<=R){ int mid=(L+R)/2; if(check(mid,X)){ R=mid-1; ans=mid; } else L=mid+1; } printf("%d\n",ans); } return 0; }