Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34063 | A21μΘ_wjy | 【S】T1 | C++ | 通过 | 100 | 820 MS | 74360 KB | 1549 | 2024-11-03 14:11:23 |
#include<bits/stdc++.h> using namespace std; const int maxn=5e5+7; bool ST; int n,k; int a[maxn]; int LG[maxn]; int STMin[20][maxn],STMax[20][maxn]; bool ED; inline void GetLG(){ LG[0]=-1; for(int i=1;i<maxn;i++)LG[i]=LG[i>>1]+1; } inline void GetST(){ for(int i=1;i<=n;i++)STMax[0][i]=STMin[0][i]=a[i]; for(int j=1;j<=LG[n];j++){ for(int i=1;i<=n-(1<<j)+1;i++){ STMin[j][i]=min(STMin[j-1][i],STMin[j-1][i+(1<<j-1)]); STMax[j][i]=max(STMax[j-1][i],STMax[j-1][i+(1<<j-1)]); } } } inline int D(int l,int r){ int t=LG[r-l+1]; return max(STMax[t][l],STMax[t][r-(1<<t)+1])-min(STMin[t][l],STMin[t][r-(1<<t)+1]); } inline void rd(int &x){ x=0;int f=1; char ch=getchar(); while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();} while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} x*=f; } inline bool chk(int Len,int x){ int cnt=0; for(int i=1;i<=(n-Len+1);i++)cnt+=(D(i,i+Len-1)>=x) ; return cnt>=k; } inline void slv(){ rd(n),rd(k); for(int i=1;i<=n;i++)rd(a[i]); GetST(); int X=2e9; for(int i=1;i<=k;i++)X=min(X,D(i,i+n-k)); int l=1,r=n-k+1; while(l<r){ int mid=l+r>>1; if(chk(mid,X))r=mid; else l=mid+1; } cout<<X<<" "<<l<<endl; } signed main(){ // freopen("choose.in","r",stdin); // freopen("choose.out","w",stdout); GetLG(); int T=0;rd(T); while(T--)slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<endl; }