一个奇怪的问题
查看原帖
一个奇怪的问题
658786
STUDENT00楼主2022/9/2 19:56

为什么我把二分的左点设为-1e9,把右点设为1e9,就是90pts(WA on 3),而把左点设为-1e5,把右点设为1e5,就AC了???

90分代码:

#include<bits/stdc++.h>
using namespace std;
int n,s,t,a[100010],q[100010];
double l=-1e9,r=1e9,mid,b[100010],sum[100010];
bool check(double k){
	for(int i=1;i<=n;i++) b[i]=a[i]-k;
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
	int l=1,r=0;
	for(int i=1;i<=n;i++){
		if(i>=s){
			while(r>=l&&sum[i-s]<sum[q[r]]) r--;
			q[++r]=i-s;
		}
		if(l<=r&&q[l]<i-t) l++;
		if(l<=r&&sum[i]>=sum[q[l]]) return 1;
	}
	return 0;
}
int main(){
	scanf("%d%d%d",&n,&s,&t);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	mid=(l+r)/2;
	while(r-l>1e-4){
		if(check(mid)) l=mid;
		else r=mid;
		mid=(l+r)/2;
	}
	printf("%.3lf",mid);
	return 0;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,s,t,a[100010],q[100010];
double l=-1e9,r=1e9,mid,b[100010],sum[100010];
bool check(double k){
	for(int i=1;i<=n;i++) b[i]=a[i]-k;
	for(int i=1;i<=n;i++) sum[i]=sum[i-1]+b[i];
	int l=1,r=0;
	for(int i=1;i<=n;i++){
		if(i>=s){
			while(r>=l&&sum[i-s]<sum[q[r]]) r--;
			q[++r]=i-s;
		}
		if(l<=r&&q[l]<i-t) l++;
		if(l<=r&&sum[i]>=sum[q[l]]) return 1;
	}
	return 0;
}
int main(){
	scanf("%d%d%d",&n,&s,&t);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	mid=(l+r)/2;
	while(r-l>1e-4){
		if(check(mid)) l=mid;
		else r=mid;
		mid=(l+r)/2;
	}
	printf("%.3lf",mid);
	return 0;
}
2022/9/2 19:56
加载中...