Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34270 | 22级廖思学 | 【S】T1 | C++ | 通过 | 100 | 734 MS | 13856 KB | 2361 | 2024-11-04 11:44:00 |
#include<bits/stdc++.h> using namespace std; // #define int long long int read(){ int x=0,f=1; char c=getchar(); while(c>'9'||c<'0'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=x*10+c-'0'; c=getchar(); } return x*f; } 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]}; 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++){ 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){ d[i-j+1]++;d[n-j+2]--;flag=1; } } 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){ d[i-j+1]++;d[n-j+2]--; 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]}; if(q[FR].x-p[fr].x>=lim){ d[i-j+1]++;d[n-j+2]--; break; } } } for(int i=1;i<=len;i++){ c[i]=c[i-1]+d[i]; } int L=len;while(c[L]>=k)L--; printf("%d %d\n",lim,L+1); } signed main(){ // freopen("choose.in","r",stdin); // freopen("choose-.out","w",stdout); T=read(); while(T--){ init();lim=2000000000; n=read(),k=read(); for(int i=1;i<=n;i++)a[i]=read(); find_max(n-k+1); slv(n-k+1); } return 0; }