20pts求调
查看原帖
20pts求调
477821
toolong114514楼主2025/1/21 17:19

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;
}
2025/1/21 17:19
加载中...