RT,感觉思路没啥问题,像是被卡精度了。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<deque>
using namespace std;
#define int long long
const int INF=0x7fffffffffffffff;
const int N=1e5+10;
const int K=1e7;
deque<int> q1,q2,q;
double tmp[N];
int a[N];
int t,n,k,l,r;
double ans;
bool check(double x){
double hp=double(k)*x;
q.clear();
for(int i=1;i<=n;i++){
tmp[i]=double(a[i])+double(i)*x;
}
for(int i=l;i<=n;i++){
while(!q.empty()&&q.front()<=i-r) q.pop_front();
while(!q.empty()&&tmp[q.back()]<=tmp[i-l+1]) q.pop_back();
q.push_back(i-l+1);
if(tmp[q.front()]-tmp[i]>=hp) return true;
}
q.clear();
for(int i=1;i<=n;i++){
tmp[i]=double(a[i])-double(i)*x;
}
for(int i=l;i<=n;i++){
while(!q.empty()&&q.front()<=i-r) q.pop_front();
while(!q.empty()&&tmp[q.back()]>=tmp[i-l+1]) q.pop_back();
q.push_back(i-l+1);
if(tmp[i]-tmp[q.front()]>=hp) return true;
}
return false;
}
signed main(){
ios::sync_with_stdio(false);
cin>>t;
while(t--){
ans=0.0;
cin>>n>>k>>l>>r;
for(int i=1;i<=n;i++){
cin>>a[i];
}
q1.clear(),q2.clear();
for(int i=1;i<=n;i++){
while(!q1.empty()&&q1.front()<=i-l) q1.pop_front();
while(!q2.empty()&&q2.front()<=i-l) q2.pop_front();
while(!q1.empty()&&a[q1.back()]<=a[i]) q1.pop_back();
while(!q2.empty()&&a[q2.back()]>=a[i]) q2.pop_back();
q1.push_back(i),q2.push_back(i);
ans=max(ans,double(a[q1.front()]-a[q2.front()])/double(l+k));
}
// cout<<ans<<endl;
int ll=0,rr=0;
for(int i=1;i<=n;i++){
rr=max(rr,a[i]);
}
rr*=K;
while(ll<=rr){
int mid=(ll+rr)/2;
double now=double(mid)/double(K);
if(check(now)){
ans=max(ans,now);
ll=mid+1;
}else{
rr=mid-1;
}
}
printf("%.4lf\n",ans);
//cout<<setprecision(4)<<fixed<<ans<<'\n';
}
return 0;
}