提交时间:2024-11-03 14:15:41
运行 ID: 34066
#include<bits/stdc++.h> #define int long long using namespace std; int i,j,t,n,k,a[500010],sum[500010],now[500010],ans=-1e12,nowlen,nowtot; deque<pair<int,int>> nowmax; deque<pair<int,int>> nowmin; inline bool cmp(int a,int b){ return a>b; }inline int run(int l){ //cout<<x<<' '<<l<<'\n'; nowtot=0; nowmax.push_back(make_pair(1,a[1])); nowmin.push_back(make_pair(1,a[1])); for(i=1;i+l-1<=n;i++){ int r=i+l-1; //cout<<i<<' '<<r<<'\n'; if(i==1){ for(j=1;j<=r;j++){ while(nowmax.size()&&nowmax.back().second<=a[j]){ nowmax.pop_back(); }nowmax.push_back(make_pair(j,a[j])); while(nowmin.size()&&nowmin.back().second>=a[j]){ nowmin.pop_back(); }nowmin.push_back(make_pair(j,a[j])); } }while(nowmax.size()&&nowmax.back().second<=a[r]){ nowmax.pop_back(); }nowmax.push_back(make_pair(r,a[r])); while(nowmin.size()&&nowmin.back().second>=a[r]){ nowmin.pop_back(); }nowmin.push_back(make_pair(r,a[r])); while(nowmax.size()&&nowmax.front().first<i){ nowmax.pop_front(); }while(nowmin.size()&&nowmin.front().first<i){ nowmin.pop_front(); } now[++nowtot]=nowmax.front().second-nowmin.front().second; }sort(now+1,now+nowtot+1,cmp); nowmax.clear(); nowmin.clear(); return now[k]; }inline int bs_to_findl(int x){ int l=1,r=n-k+1,mid=0; while(l<r){ mid=(l+r)>>1; if(run(mid)>=x){ r=mid; }else{ l=mid+1; } }if(run(r)>=x){ return r; }else{ return 0; } }signed main(){ //ios::sync_with_stdio(0); //freopen("choose.in","r",stdin); //freopen("choose.out","w",stdout); //cin>>t; scanf("%lld",&t); while(t--){ //cout<<t<<'\n'; scanf("%lld %lld",&n,&k); ans=-1e12;nowlen=0; for(int i=1;i<=n;i++){ scanf("%lld",&a[i]); }int maxx=run(n-k+1); cout<<maxx<<' '<<bs_to_findl(maxx)<<'\n'; } }