提交时间:2024-11-03 20:43:28

运行 ID: 34210

#include<bits/stdc++.h> using namespace std; #define N 500005 #define ll int inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } ll t,n,k; ll a[N]; ll q1[N],q2[N],p1[N],p2[N],head1,rear1,head2,rear2; ll Ans1,Ans2; int cnt[N]; int main(){ //freopen("choose5.in","r",stdin); //freopen("choose5.out","w",stdout); cin>>t; while(t--){ memset(cnt,0,sizeof(cnt)); Ans1=Ans2=0; cin>>n>>k; for(int i=1;i<=n;i++){ a[i]=read(); } rear1=rear2=head1=head2=0; Ans1=2e9; for(int i=1;i<=n;i++){ while(head1<rear1 && a[i]>=q1[rear1-1]) rear1--; q1[rear1]=a[i]; p1[rear1++]=i; while(p1[head1]<=i-n+k-1) head1++; while(head2<rear2 && a[i]<=q2[rear2-1]) rear2--; q2[rear2]=a[i]; p2[rear2++]=i; int cnt[N]={0}; while(p2[head2]<=i-n+k-1) head2++; if(i>=n-k+1) Ans1=min(Ans1,q1[head1]-q2[head2]); //cout<<q1[head1]<<' '<<head1<<' '<<rear1<<' '<<q2[head2]<<' '<<head2<<' '<<rear2<<endl; } rear1=rear2=head1=head2=0; int r=0; for(int i=1;i<=n;i++){ while(p1[head1]<i && head1<rear1) head1++; while(p2[head2]<i && head2<rear2) head2++; while(r<n && (head1>=rear1 || head2>=rear2 || q1[head1]-q2[head2]<Ans1)){ r++; while(head1<rear1 && a[r]>q1[rear1-1]) rear1--; while(head2<rear2 && a[r]<q2[rear2-1]) rear2--; q1[rear1]=a[r]; p1[rear1++]=r; q2[rear2]=a[r]; p2[rear2++]=r; } if(q1[head1]-q2[head2]<Ans1) break; cnt[r-i+1]++; cnt[n-i+2]--; //cout<<p1[head1]<<' '<<p2[head2]<<endl; //cout<<r-i+1<<' '<<n-i+2<<endl<<endl; } //cout<<endl; for(int i=1;i<=n;i++){ //cout<<cnt[i]<<'*'; cnt[i]+=cnt[i-1]; if(cnt[i]>=k){ Ans2=i; break; } } cout<<Ans1<<' '<<Ans2<<endl; } return 0; }