Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34121 daimo 【S】T1 C++ 通过 100 927 MS 70436 KB 1300 2024-11-03 15:09:19

Tests(10/10):


#include<bits/stdc++.h> using namespace std; int n,k; int st[30][500010][2]; inline int query(int i,int j){ int lg=__lg(j); return max(st[lg][i][0],st[lg][i+j-(1<<lg)][0])-min(st[lg][i][1],st[lg][i+j-(1<<lg)][1]); } inline bool check2(int len,int x){ int sum=0; for(int i=1;i<=n-len+1;i++){if(query(i,len)>=x)sum++;} return sum>=k; } inline int calc(int len){ int sum=0; int res=2147483647; for(int i=1;i<=n-len+1;i++){res=min(res,query(i,len));} return res; } signed main(){ ios::sync_with_stdio(0); int _; cin>>_; while(_--){ cin>>n>>k; for(int i=1;i<=n;i++){ cin>>st[0][i][0]; st[0][i][1]=st[0][i][0]; } int L=__lg(n); for(int i=1;i<=L;i++){ for(int j=1;j+(1<<i)-1<=n;j++){ st[i][j][0]=max(st[i-1][j][0],st[i-1][j+(1<<(i-1))][0]); st[i][j][1]=min(st[i-1][j][1],st[i-1][j+(1<<(i-1))][1]); //cout<<j<<' '<<i<<' '<<st[j][i][0]<<' '<<st[j][i][1]<<endl; } } int l=1,r=n-k+1,ans=calc(n-k+1),mn=n-k+1; while(l<=r){ int len=l+r>>1; int ll=l,rr=r; // cout<<"len"<<len<<' '<<x<<' '<<check2(len,x)<<endl; if(check2(len,ans)){ r=len-1; mn=len; }else{ l=len+1; } if(ll==l&&rr==r)break; } while(mn>1&&check2(mn-1,ans))mn--; cout<<ans<<' '<<mn<<endl; } return 0; }


测评信息: