Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34268 | 22级廖思学 | 【S】T1 | C++ | 解答错误 | 0 | 12 MS | 10036 KB | 2227 | 2024-11-04 11:40:04 |
#include<bits/stdc++.h> using namespace std; // #define int 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]}; 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]; // 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=2000000000; 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; }