提交时间:2024-11-03 13:33:31

运行 ID: 34041

#include<bits/stdc++.h> #define pii pair<int,int> #define mk make_pair #define fi first #define se second #define gc getchar using namespace std; const int N=5e5+10; int a[N];int n; void cmn(int &a,int b){ if(b<a) a=b; }void cmx(int &a,int b){ if(b>a) a=b; }int ans=0;int k; inline int read(){ int t=0,f=1;char ch=gc(); while(!(ch>='0'&&ch<='9')){ if(ch=='-') f=-1;ch=gc(); }while((ch>='0'&&ch<='9')) t=t*10+ch-'0',ch=gc(); return t*f; } int tmp[N]; pii c[2][N*2]; int tl[2],tp[2]; inline int calc(int x){ tl[0]=1,tl[1]=1,tp[0]=0,tp[1]=0; int res=0x7f7f7f7f;int cnt=0; for(int i=1;i<x;i++){ while(tp[0]>=tl[0]){ if(c[0][tp[0]].se>a[i]) break; else tp[0]--; }while(tp[1]>=tl[1]){ if(c[1][tp[1]].se<a[i]) break; else tp[1]--; }c[0][++tp[0]]=mk(i,a[i]);c[1][++tp[1]]=mk(i,a[i]); }for(int i=x;i<=n;i++){ if(tp[0]>=tl[0]){ if(c[0][tl[0]].fi<=i-x) tl[0]++; }if(tp[1]>=tl[1]){ if(c[1][tl[1]].fi<=i-x) tl[1]++; }while(tp[0]>=tl[0]){ if(c[0][tp[0]].se>a[i]) break; else tp[0]--; }while(tp[1]>=tl[1]){ if(c[1][tp[1]].se<a[i]) break; else tp[1]--; }c[0][++tp[0]]=mk(i,a[i]);c[1][++tp[1]]=mk(i,a[i]); cmn(res,c[0][tl[0]].se-c[1][tl[1]].se); } return res; }inline int calc2(int x,int s){ tl[0]=1,tl[1]=1,tp[0]=0,tp[1]=0; int cnt=0,fla=0; for(int i=1;i<x;i++){ while(tp[0]>=tl[0]){ if(c[0][tp[0]].se>a[i]) break; else tp[0]--; }while(tp[1]>=tl[1]){ if(c[1][tp[1]].se<a[i]) break; else tp[1]--; }c[0][++tp[0]]=mk(i,a[i]);c[1][++tp[1]]=mk(i,a[i]); }for(int i=x;i<=n;i++){ if(tp[0]>=tl[0]){ if(c[0][tl[0]].fi<=i-x) tl[0]++; }if(tp[1]>=tl[1]){ if(c[1][tl[1]].fi<=i-x) tl[1]++; }while(tp[0]>=tl[0]){ if(c[0][tp[0]].se>a[i]) break; else tp[0]--; }while(tp[1]>=tl[1]){ if(c[1][tp[1]].se<a[i]) break; else tp[1]--; }c[0][++tp[0]]=mk(i,a[i]);c[1][++tp[1]]=mk(i,a[i]); int val=c[0][tl[0]].se-c[1][tl[1]].se; if(val>=s) cnt++; } return cnt; }inline void slv(){ n=read(),k=read(); //cerr<<n<<endl; for(int i=1;i<=n;i++) a[i]=read(); int l=1,r=n-k+1; ans=calc(r); while(l<r){ //cout<<l<<' '<<r<<endl; int mid=(l+r)/2; if(calc2(mid,ans)>=k) r=mid; else l=mid+1; }printf("%d %d\n",ans,l); } int main(){ int t=read();while(t--) slv(); return 0; }