提交时间:2024-11-03 14:01:17

运行 ID: 34050

#include<bits/stdc++.h> using namespace std; #define int long long int n,k; int a[500300]; int d[500300]; struct D{ int A[1000300]; int l,r; D(){ l=5e5+1,r=5e5; } inline bool empty(){return l>r;} inline int front(){ return A[l]; } inline void clr(){ l=5e5+1,r=5e5; // memset(A,0,sizeof(A)); } inline int back(){ return A[r]; } inline void push_front(int x){ A[--l]=x; } inline void push_back(int x){ A[++r]=x; } inline void pop_front(){ ++l; } inline void pop_back(){ --r; } }mn,mx; inline int calc(int lim){ memset(d,0,sizeof(d)); int r=0; mx.clr(),mn.clr(); for(int l=1;l<=n;l++){ if(!mx.empty()&&mx.front()<l)mx.pop_front(); if(!mn.empty()&&mn.front()<l)mn.pop_front(); while(mx.empty()||a[mx.front()]-a[mn.front()]<lim){ r++; while(!mx.empty()&&a[mx.back()]<a[r])mx.pop_back(); mx.push_back(r); while(!mn.empty()&&a[mn.back()]>a[r])mn.pop_back(); mn.push_back(r); } int L=r-l+1,R=n+1-l+1; d[L]++; d[R]--; } if(d[0]>=k)return 0; for(int i=1;i<=n;i++){ d[i]+=d[i-1]; if(d[i]>=k)return i; } return -1; } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("choose.in","r",stdin); // freopen("choose.out","w",stdout); int t; cin>>t; while(t--){ cin>>n>>k; for(int i=1;i<=n;i++)cin>>a[i]; a[n+1]=3e9; int r=0; int len=n-k+1; mx.clr(),mn.clr(); memset(d,0,sizeof(d)); vector<int>T; for(int i=1;i<=k;i++){ if(!mx.empty()&&mx.front()<i)mx.pop_front(); if(!mn.empty()&&mn.front()<i)mn.pop_front(); while(r<i+len-1){ ++r; while(!mx.empty()&&a[mx.back()]<a[r])mx.pop_back(); mx.push_back(r); while(!mn.empty()&&a[mn.back()]>a[r])mn.pop_back(); mn.push_back(r); } T.push_back(a[mx.front()]-a[mn.front()]); } int x=2e9; for(int y:T) x=min(x,y); cout<<x<<" "<<calc(x)<<endl; } cout.flush(); return 0; }