ABC F 求调
  • 板块题目总版
  • 楼主Tang_chao
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/21 22:17
  • 上次更新2024/12/21 22:24:36
查看原帖
ABC F 求调
532560
Tang_chao楼主2024/12/21 22:17

貌似有种东西能卡爆我的写法、、、
把二分的 rr 设为 10910^9 没有 TLE(117ms),设为 101010^{10} 会 TLE 一个点(其余最高122ms),设为 101810^{18} 会 TLE 十个点(其余最高168ms)

能不能试着改一下qwq
驱蚊器
去污区
轻武器

#include<bits/stdc++.h>
using namespace std;
#define N 200009
#define int long long
#define ld long double
int n,x[N],h[N];
ld eps = 1e-10;
ld K(int u,ld v,int x,int y){ return (ld)(y - v) * 1.0 / (x - u); }
ld B(int u,ld v,int x,int y){ return (ld)y - K(u,v,x,y) * x; }
bool chk(ld mid){
	//cout<<mid<<":"<<endl;
	int l = 1,r = 0,u = x[1],v = h[1];
	for(int i = 2;i <= n;i++){
		ld k = K(0,mid,u,v),b = B(0,mid,u,v);
		//cout<<i<<" "<<k<<" "<<b<<endl;
		if(k * x[i] + b >= h[i]) return 0;
		if(k <= K(0,mid,x[i],h[i])) u = x[i],v = h[i];
	}
	return 1;
}
signed main(){
	cin.tie(0); cout.tie(0);
	ios::sync_with_stdio(0); 
	cin>>n;
	for(int i = 1;i <= n;i++) cin>>x[i]>>h[i];
	if(chk(0)){
		cout<<-1<<endl;
		return 0;
	}
	ld l = 0,r = 1e9,res = 0;
	while(r - l >= eps){
		ld mid = (l + r - eps) / 2.0;
		if(chk(mid)) r = mid - eps,res = mid;
		else l = mid + eps;
	}
	cout<<fixed<<setprecision(10)<<res<<endl;
	return 0;
}
2024/12/21 22:17
加载中...