提交时间:2024-11-03 16:11:27

运行 ID: 34158

#include<bits/stdc++.h> using namespace std; long long T,LLN=-0x3f3f3f3f3f3f3f3f,LLX=0x3f3f3f3f3f3f3f3f; long long f[500005][20][2],a[500005],a1,a2; long long n,k; long long fd(long long l,long long r){ long long k=__lg(r-l+1); return max(f[l][k][0],f[r-(1<<k)+1][k][0])-min(f[l][k][1],f[r-(1<<k)+1][k][1]); } long long ck(long long l){ long long sum=0; for(int i=1;i+l-1<=n;i++){ if(fd(i,i+l-1)>=a1)sum++; if(sum>=k)return 1; } return 0; } int main(){ scanf("%lld",&T); while(T--){ scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); f[i][0][0]=f[i][0][1]=a[i]; } for(int j=1;j<=__lg(n)+1;j++){ for(int i=1;i<=n-(i<<(j-1));i++){ f[i][j][0]=max(f[i][j-1][0],f[i+(1<<(j-1))][j-1][0]); f[i][j][1]=min(f[i][j-1][1],f[i+(1<<(j-1))][j-1][1]); } } a1=LLX,a2=0; for(int i=1;i<=k;i++){ a1=min(a1,fd(i,i+n-k)); } long long l=1,r=n-k+1; while(l<r){ long long mid=(l+r)/2; if(ck(mid)){ r=mid; } else l=mid+1; } printf("%lld %lld\n",a1,l); } }