求助,eps无论定多少都会寄
查看原帖
求助,eps无论定多少都会寄
709361
盐焗蛋楼主2024/10/1 16:13

是这样的,eps精确点就寄,不精确又会被毒瘤卡掉(

#include <bits/stdc++.h>
#define int long long
#define double long double
using namespace std;
const double eps1=1e-16;
const double eps2=1e-16;
double l,r,bao,mid;
int n,q,k,dq,a[100005],b[100005];
int gcd(int x,int y){return y?gcd(y,x%y):x;}
int pd(double mid){
	int ans=0,dq=0;
	for(int i=1;i<=n;i++){
		while(dq<n&&1.0*a[dq+1]/b[i]<=mid) dq++;
		ans+=dq;
	}
	return ans;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(NULL);cout.tie(NULL);
	//LL!
	cin>>n>>q;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++) cin>>b[i];
	sort(a+1,a+n+1);
	sort(b+1,b+n+1);
	while(q--){
		cin>>k;
		l=0;r=1e6;bao=0;
		while(r-l>=eps1){
			mid=(l+r)/2;//db
			if(pd(mid)>=k) bao=mid,r=mid;
			else l=mid;
		}
		dq=0;
		for(int i=1;i<=n;i++){
			while(dq<n&&1.0*a[dq+1]/b[i]-bao<=eps2&&fabs(1.0*a[dq+1]/b[i]-bao)>eps2) dq++;
			if(fabs(1.0*a[dq+1]/b[i]-bao)<=eps2){
				int fz=a[dq+1],fm=b[i],gd=gcd(fz,fm);
				fz/=gd;fm/=gd;
				cout<<fz<<" "<<fm<<"\n";
				break;
			}
		}
	}
	return 0;
}
/*

*/
2024/10/1 16:13
加载中...