提交时间:2024-11-03 16:15:56

运行 ID: 34159

#include<bits/stdc++.h> using namespace std; int t,n,k; const int N=500005; struct node{ int x,z; }maxn[N],minn[N]; int a[N]; int fx,fn,lx=-1,ln=-1; int c[N]; int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); //freopen("choose4.in","r",stdin); //freopen("choose4.out","w",stdout); cin>>t; while(t--){ cin>>n>>k; fx=fn=0; lx=ln=-1; int ans=2e9+10; //cout<<1; memset(c,0,sizeof c); for(int i=1;i<=n;i++){ //cout<<i<<" "; cin>>a[i]; //cout<<" "<<a[i]<<endl; while(a[i]>maxn[lx].z&&fx<=lx) lx--; while(a[i]<minn[ln].z&&fn<=ln) ln--; while(maxn[fx].x<=i-n+k-1&&fx<=lx) fx++; while(minn[fn].x<=i-n+k-1&&fn<=ln) fn++; maxn[++lx]=node{i,a[i]}; minn[++ln]=node{i,a[i]}; //cout<<maxn[lx].x<<" "<<minn[ln].x<<endl; //cout<<maxn[fx].x<<" "<<maxn[fn].z<<" "<<minn[fn].x<<" "<<minn[fn].z<<endl; if(i>=n-k+1){ ans=min(ans,maxn[fx].z-minn[fn].z); //cout<<maxn[fx].z<<" "<<minn[fn].z<<" "<<maxn[fx].z-minn[fn].z<<" "<<maxn[fx].x<<" "<<minn[fn].x<<endl; } } //cout<<n<<" "<<k<<endl; fx=fn=0; lx=ln=-1; int r=0; //cout<<n<<" "<<k<<endl; for(int i=1;i<=n;i++){ //cout<<i<<" "; while(maxn[fx].x<i&&fx<=lx) fx++; while(minn[fn].x<i&&fn<=ln) fn++; while(r<n&&(lx<fx||ln<fn||maxn[fx].z-minn[fn].z<ans)){ r++; while(fx<=lx&&a[r]>maxn[lx].z) lx--; while(fn<=ln&&a[r]<minn[ln].z) ln--; maxn[++lx]=node{r,a[r]}; minn[++ln]=node{r,a[r]}; } if(maxn[fx].z-minn[fn].z<ans) break; c[r-i+1]+=1; //cout<<maxn[fx].x<<" "<<minn[fn].x<<endl; c[n-i+2]-=1; } //cout<<n<<" "<<k<<endl; //cout<<3; for(int i=1;i<=n;i++){ //cout<<c[i]<<" "; c[i]+=c[i-1]; if(c[i]>=k){ cout<<ans<<" "<<i<<endl; break; } } //cout<<4; } cout.flush(); return 0; }