提交时间:2024-11-03 13:32:54
运行 ID: 34040
#include<bits/stdc++.h> #define max(x,y) ((x)<(y)?(y):(x)) #define min(x,y) ((x)<(y)?(x):(y)) using namespace std; inline void read(int &x){ x=0; char c=getchar(); bool f=0; while(!isdigit(c)){if(c=='-')f=1;c=getchar();} while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } int n,k,a[500005]; int mx[19][500005],mn[19][500005],lg[500005]; inline void init(){ for(int i=1;i<=n;i++)mx[0][i]=mn[0][i]=a[i]; for(int j=1;j<19;j++){ for(int i=1;i+(1<<j)-1<=n;i++){ mx[j][i]=max(mx[j-1][i],mx[j-1][i+(1<<(j-1))]); mn[j][i]=min(mn[j-1][i],mn[j-1][i+(1<<(j-1))]); } } } inline int qumx(int l,int r){ return max(mx[lg[r-l+1]][l],mx[lg[r-l+1]][r-(1<<lg[r-l+1])+1]); } inline int qumn(int l,int r){ return min(mn[lg[r-l+1]][l],mn[lg[r-l+1]][r-(1<<lg[r-l+1])+1]); } inline bool chk(int len,int x){ int cnt=0; for(int i=1;i+len-1<=n;i++){ if(qumx(i,i+len-1)-qumn(i,i+len-1)>=x)cnt++; if(cnt>=k)return 1; } return 0; } inline int calc(int len){ long long l=0,r=qumx(1,n)-qumn(1,n),mid; while(l<r){ mid=l+r+1>>1; if(chk(len,mid))l=mid; else r=mid-1; } return l; } inline void slv(){ read(n),read(k); for(int i=1;i<=n;i++)read(a[i]); init(); int l=1,r=n-k+1,mid; // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; int ans=calc(n-k+1); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; while(l<r){ mid=l+r>>1; if(chk(mid,ans))r=mid; else l=mid+1; } // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; printf("%d %d\n",ans,l); } int main(){ lg[1]=0; for(int i=2;i<=500000;i++){ lg[i]=lg[i>>1]+1; } int T; read(T); while(T--)slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"; return 0; }