Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
34191 swzzzz 【S】T1 C++ 运行超时 90 1000 MS 2228 KB 2098 2024-11-03 18:51:18

Tests(9/10):


#include<bits/stdc++.h> using namespace std; #define N 500005 #define ll int inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } ll t,n,k; ll a[N]; ll q1[N],q2[N],p1[N],p2[N],head1,rear1,head2,rear2; ll Ans1,Ans2; ll Max=-1000000009,Min=1000000009; bool check2(ll x){ rear1=rear2=head1=head2=0; int cnt=0; for(int i=1;i<=n;i++){ while(head1<rear1 && a[i]>=q1[rear1-1]) rear1--; q1[rear1]=a[i]; p1[rear1++]=i; while(p1[head1]<=i-x) head1++; while(head2<rear2 && a[i]<=q2[rear2-1]) rear2--; q2[rear2]=a[i]; p2[rear2++]=i; while(p2[head2]<=i-x) head2++; if(q1[head1]-q2[head2]>=Ans1 && i>=x) cnt++; if(cnt>=k) return 1; if(n-i+cnt<k)return 0; } if(cnt>=k) return 1; else return 0; } int main(){ //freopen("choose5.in","r",stdin); //freopen("choose5.out","w",stdout); cin>>t; while(t--){ Ans1=Ans2=0; cin>>n>>k; for(int i=1;i<=n;i++){ a[i]=read(); } rear1=rear2=head1=head2=0; int cnt=0; Ans1=2e9; for(int i=1;i<=n;i++){ while(head1<rear1 && a[i]>=q1[rear1-1]) rear1--; q1[rear1]=a[i]; p1[rear1++]=i; while(p1[head1]<=i-n+k-1) head1++; while(head2<rear2 && a[i]<=q2[rear2-1]) rear2--; q2[rear2]=a[i]; p2[rear2++]=i; while(p2[head2]<=i-n+k-1) head2++; if(i>=n-k+1) Ans1=min(Ans1,q1[head1]-q2[head2]); //cout<<q1[head1]<<' '<<head1<<' '<<rear1<<' '<<q2[head2]<<' '<<head2<<' '<<rear2<<endl; } int l=1,r=n-k+1; while(l<=r){ int mid=l+(r-l)/2; if(check2(mid)){ Ans2=mid; r=mid-1; }else l=mid+1; } cout<<Ans1<<' '<<Ans2<<endl; } return 0; }


测评信息: