提交时间:2024-11-04 08:29:20

运行 ID: 34247

#include<bits/stdc++.h> using namespace std; #define ing long long const int N=5e5+10; int T,n,k,a[N],lim; struct MQ{int id,x;}p[N],q[N];int FR,fr,BK,bk; void find_max(int len){ for(int i=1;i<=n;i++){ while(q[FR].id<i-len+1&&FR<=BK)FR++; while(q[BK].x<=a[i]&&BK>=FR&&BK>=1)BK--;q[++BK]={i,a[i]}; while(p[fr].id<i-len+1&&fr<=bk)fr++; while(p[bk].x>=a[i]&&bk>=fr&&bk>=1)bk--;p[++bk]={i,a[i]}; // cout<<i<<" "<<q[FR].x<<" "<<p[fr].x<<endl; if(i>=len)lim=min(lim,q[FR].x-p[fr].x); } } int c[N],d[N]; inline void init(){ FR=fr=1;BK=bk=0; for(int i=0;i<=5e5+5;i++)p[i]=q[i]={0,0}; for(int i=0;i<=5e5+5;i++)d[i]=0; } void slv(int len){ init(); int i=0; for(int j=1;j<=n;j++){ // cout<<"**"<<CNT<<" "<<j<<" "<<i<<endl; bool flag=0; while(j>i){ i++; while((q[FR].id<i-len+1||q[FR].id<j)&&FR<=BK)FR++; while(q[BK].x<=a[i]&&BK>=FR&&BK>=1)BK--;q[++BK]={i,a[i]}; while((p[fr].id<i-len+1||p[fr].id<j)&&fr<=bk)fr++; while(p[bk].x>=a[i]&&bk>=fr&&bk>=1)bk--;p[++bk]={i,a[i]}; if(q[FR].x-p[fr].x>=lim){ // cout<<i<<" "<<j<<" "<<q[FR].x<<" "<<q[FR].id<<" "<<q[BK].id<<" "<<q[BK].x<<" "<<p[fr].x<<" "<<p[fr].id<<" "<<p[bk].id<<" "<<p[bk].x<<endl; // cout<<i-j+1<<" "<<n-j+1<<endl; d[i-j+1]++;d[n-j+2]--;flag=1; } // cout<<"&&&&&&&&&&&"<<j<<endl; } while((q[FR].id<i-len+1||q[FR].id<j)&&FR<=BK)FR++; while((p[fr].id<i-len+1||p[fr].id<j)&&fr<=bk)fr++; if(q[FR].x-p[fr].x>=lim){ // cout<<i<<" "<<j<<" "<<q[FR].x<<" "<<q[FR].id<<" "<<q[BK].id<<" "<<q[BK].x<<" "<<p[fr].x<<" "<<p[fr].id<<" "<<p[bk].id<<" "<<p[bk].x<<endl; d[i-j+1]++;d[n-j+2]--; // cout<<"???"<<j<<" "<<i-j+1<<" "<<n-j+1<<endl; flag=1; } while(i<=n&&(!flag)){ i++; while((q[FR].id<i-len+1||q[FR].id<j)&&FR<=BK)FR++; while(q[BK].x<=a[i]&&BK>=FR&&BK>=1)BK--;q[++BK]={i,a[i]}; while((p[fr].id<i-len+1||p[fr].id<j)&&fr<=bk)fr++; while(p[bk].x>=a[i]&&bk>=fr&&bk>=1)bk--;p[++bk]={i,a[i]}; //cout<<i<<" "<<j<<" "<<q[FR].x<<" "<<q[FR].id<<" "<<p[fr].x<<" "<<p[fr].id<<endl; if(q[FR].x-p[fr].x>=lim){ // cout<<i<<" "<<j<<" "<<q[FR].x<<" "<<q[FR].id<<" "<<q[BK].id<<" "<<q[BK].x<<" "<<p[fr].x<<" "<<p[fr].id<<" "<<p[bk].id<<" "<<p[bk].x<<endl; d[i-j+1]++;d[n-j+2]--; // cout<<"???"<<j<<" "<<i-j+1<<" "<<n-j+1<<endl; break; } } } for(int i=1;i<=len;i++){ c[i]=c[i-1]+d[i]; // cout<<c[i]<<" "; }//cout<<endl; // cout<<"!"<<endl; int L=len;while(c[L]>=k)L--;//cout<<L<<endl; printf("%lld %lld\n",lim,L+1); } signed main(){ freopen("choose.in","r",stdin); freopen("choose-.out","w",stdout); scanf("%lld",&T); while(T--){ init();lim=10000000000; scanf("%lld%lld",&n,&k); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); find_max(n-k+1); slv(n-k+1); } return 0; }