Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34178 | 李羽乔 | 【S】T1 | C++ | 通过 | 100 | 819 MS | 74364 KB | 1797 | 2024-11-03 16:31:26 |
#include<bits/stdc++.h> using namespace std; const int N = 5e5+10; int T,n,k,ans,lnog[N],st[2][21][N]; int a[N]; template<typename type> inline void read(type &x) { x=0;bool flag(0);char ch=getchar(); while(!isdigit(ch)) flag=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); flag?x=-x:0; } inline void getlog(){ lnog[1]=0; for(int i=2;i<=n;i++){ lnog[i]=lnog[i>>1]+1; } } inline int query(int l,int r){ int i=lnog[r-l+1]; return max(st[1][i][l],st[1][i][r-(1 << i)+1])-min(st[0][i][l],st[0][i][r-(1 << i)+1]); } inline bool check(int x,int y){ int cnt=0; for(int i=1;i<=n-x+1;i++){ if(query(i,i+x-1)>=y){ cnt++; } } if(cnt>=k) return true; else return false; } int main(){ //freopen("choose.in","r",stdin); //freopen("choose.out","w",stdout); read(T); while(T--){ ans=0; read(n); read(k); for(int i=1;i<=n;i++){ read(a[i]); st[1][0][i]=a[i]; st[0][0][i]=a[i]; } int X=2e9; for(int i=1;(1 << i)<=n;i++){ for(int j=1;j+(1<<i)-1<=n;j++){ st[1][i][j]=max(st[1][i-1][j],st[1][i-1][j+(1<<i-1)]); st[0][i][j]=min(st[0][i-1][j],st[0][i-1][j+(1<<i-1)]); } } getlog(); for(int i=1;i<=k;i++){ if(X>query(i,i+n-k)){ X=query(i,i+n-k); } } printf("%d ",X); ans=n-k+1; int L=1,R=n-k; while(L<=R){ int mid=(L+R)/2; if(check(mid,X)){ R=mid-1; ans=mid; } else L=mid+1; } printf("%d\n",ans); } return 0; }