妹子

妹子

考虑到首先判断可以横平竖直的放进去的情况。

先让 \(a_1<b_1,a_2<b_2\),然后判断是否存在 \(a_1\le a_2 \and b_2\le b_2\or a_1\ge a_2 \and b_2\ge b_2\)

否则,交换使得 \(a_1\le a_2\)

如图所示。

然后我们设一个 \(x\),利用勾股定理求一条边,接着利用相似三角形,最后用两条线段相加列出方程:

\[\sqrt{a_1^2-x^2}+\dfrac{b_1}{a_1}x=a_2 \]

先将左第二项移动到右边,然后再平方。

变形为一般式

\[(\dfrac{b_1^2}{a_1^2}+1)x^2-2\dfrac{a_2b_1}{a1}x+a_2^2-a_1^2=0 \]

利用公式法求解。

最终的答案为较小者。

注意较大者对应另一个方程,形如:

然后如果 \(\Delta<0\) 无解。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define db long double
using namespace std;
#define W(t) while(t--)
int n;
bool check(int a1,int b1,int a2,int b2){
	db a=(db)b1*b1/a1/a1+1,b=-2.0*a2*b1/a1,c=a2*a2-a1*a1;
	db delta=b*b-4*a*c;
	if(delta>=0){
		db x=(-b-sqrt(delta))/2/a;
		db y=b1*sqrt(a1*a1-x*x)/a1;
		return x+y-b2<=1e-6;
	}
	return 0;
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    scanf("%d",&n);
    W(n){
        int a1,b1,a2,b2;
        scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
        if(a1>b1)swap(a1,b1);
        if(a2>b2)swap(a2,b2);
		if(a1>a2)swap(a1,a2),swap(b1,b2);
		if(a1<=a2&&b1<=b2)puts("Yes");
		else puts(check(a1,b1,a2,b2)?"Yes":"No");//a1<=a2,b1>=b2
    }
    return 0;
}
posted @ 2023-11-17 12:58  wscqwq  阅读(5)  评论(0编辑  收藏  举报