【20180809】集训题d1
程序员文章站
2022-03-02 10:21:24
...
总结下今天比赛的情况吧,一句话,一鼓作气,三道暴力。第一道即使老师讲了可以旋转我也没在意可以斜着放,以为是道水题,如果不是出题人良心就凉了,第二道我完全应该做得出来的,方法感觉哪里听过,我也用过,考试时不知道为什么没想出来,第三道打个暴力无可厚非吧,勉强能接受一下。rank比昨天肯定好很多,但是其实这个发挥很平庸。最近心态一直比较崩,经常会觉得自己太菜有些绝望吧。到底是状态不好没有做题灵感还是水平不行,我偏向于后者吧,菜是原罪,前者也是因为后者而导致的。今天三道题目总的来说难度不是很难,目前发挥的实力与省选前的集训相去甚远,也只能继续练下去了。
第一题我开场5分钟就切掉了,没想太多,事实证明是假的。这道题如题解所说,很优雅,我觉得其实有点思维难度,当然有人暴力枚举角度也可以,我后来研究了一下正解,如果自己不画图的话其实有点难以理解。
考虑两个矩形中心重合,一个矩形旋转,另一个矩形不动,那么旋转的矩形顶点的轨迹是一个圆,若该圆在另一个矩形内部(包括相切),则该矩形可以放入另一个矩形,若该圆在另一个矩形的外部(包括内接),则该矩形不能放入另一个矩形,若圆与矩形相交,不考虑相切的情况必有 8 个交点,看一看相邻两个不在同一条边的交点能不能放短边,相隔两个不在同一条边的交点的两个点之间能不能放长边。注意特殊情况和预处理。
#include<bits/stdc++.h>
using namespace std;
int main(){
int i,j,m,a,b,c,d;
double k1,k2,n,x,y,o,p,r;
freopen("girls.in","r",stdin);
freopen("girls.out","w",stdout);
scanf("%d",&m);
for(i=1;i<=m;i++){
scanf("%d%d%d%d",&a,&b,&c,&d);
if(a>b) swap(a,b);
if(c>d) swap(c,d);
k1=sqrt((double)a*(double)a+(double)b*(double)b);
k2=sqrt((double)c*(double)c+(double)d*(double)d);
if(k2>k1){
swap(k1,k2);swap(a,c);swap(b,d);
}
if(k2*k2-b*b<0){
if(a>=c) puts("YES");
else puts("NO");
}
else{
n=sqrt((double)k2*(double)k2-(double)b*(double)b);
if(n==c){
if(a>=c)puts("YES");
else puts("NO");
continue;
}
x=((double)a+n)/2;
y=((double)a-n)/2;
o=sqrt((double)d*(double)d-x*x);
p=(double)b-o;
r=sqrt(y*y+p*p);
if(r<c) puts("NO");
else puts("YES");
}
}
return 0;
}