提交时间:2024-11-03 19:18:18

运行 ID: 34194

#include<bits/stdc++.h> using namespace std; #define int long long #define mp(x,y) make_pair(x,y) const int N=5e5+10,INF=9e9; int t,n,k,a[N]; int l,ansl,ansx; deque<int> q1,q2; int work(int len,int op){ int ret=INF,cnt=0; while(!q1.empty()) q1.pop_back(); while(!q2.empty()) q2.pop_back(); for(int i=1;i<=n;i++){ while(!q1.empty()&&q1.front()<i-len+1){ q1.pop_front(); } while(!q1.empty()&&a[i]>a[q1.back()]){ q1.pop_back(); } q1.push_back(i); while(!q2.empty()&&q2.front()<i-len+1){ q2.pop_front(); } while(!q2.empty()&&a[i]<a[q2.back()]){ q2.pop_back(); } q2.push_back(i); if(i>=len){ ret=min(ret,a[q1.front()]-a[q2.front()]); if(op&&a[q1.front()]-a[q2.front()]>=ansx){ cnt++; } } //cout<<a[q1.front()]<<' '<<a[q2.front()]<<endl; } if(!op) return ansx=ret; if(op){ if(cnt>=k) return 1; else return 0; } } void bs(){ int ll=1,rr=l,mid,p; while(ll<=rr){ mid=(ll+rr)>>1; if(work(mid,1)){ rr=mid-1; p=mid; }else{ ll=mid+1; } } ansl=p; return ; } signed main(){ freopen("test.in","r",stdin); freopen("test.out","w",stdout); scanf("%lld",&t); while(t--){ ansl=0; while(!q1.empty()) q1.pop_back(); while(!q2.empty()) q2.pop_back(); ansx=INF; scanf("%lld%lld",&n,&k); l=n-k+1; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); } ansx=work(l,0); bs(); printf("%lld %lld\n",ansx,ansl); } return 0; }