12710:[Violet 1]追风者

#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define DB long double
#define INF 1e18
#define eps 1e-8
using namespace std;
DB v1,v2,d1,d2;
struct P
{
	DB x,y;I P(Con DB& a=0,Con DB& b=0):x(a),y(b){}
	I P operator + (Con P& o) Con {return P(x+o.x,y+o.y);}
	I P operator - (Con P& o) Con {return P(x-o.x,y-o.y);}
	I P operator * (Con DB& v) Con {return P(x*v,y*v);}
	I P operator / (Con DB& v) Con {return P(x/v,y/v);}
	I DB operator * (Con P& o) Con {return x*o.x+y*o.y;}
	I DB operator ^ (Con P& o) Con {return x*o.y-y*o.x;}
}p,k,s,t;typedef P Vec;
I void Gmin(DB& x,Con DB& y) {x>y&&(x=y);}
#define L(A) sqrt((A).x*(A).x+(A).y*(A).y)
I DB D(Con P& s,Con P& A,Con P& B)//点到线段距离
{
	if(((s-A)*(B-A))<0||((s-B)*(A-B))<0) return min(L(s-A),L(s-B));//垂足不在线段上
	return fabs((s-A)^(s-B))/L(A-B);//点到直线距离
}
int main()
{
	W(cin>>p.x>>p.y>>k.x>>k.y>>v1>>s.x>>s.y>>t.x>>t.y>>v2>>d1>>d2)
	{
		Vec V1=k-p;V1=V1/L(V1)*v1;Vec V2=t-s;V2=V2/L(V2)*v2;//计算速度
		RI i,l,r,m1,m2;DB d=INF,ti=L(t-s)/v2;
		P u=p+(V1-V2)*ti,w=u+(V1+V2)*ti,g=V1*(2*ti);//u,w为折点,g为折一轮坐标总变化量
		l=0,r=1e9;W(r-l>12) m1=l+(r-l)/3,m2=l+2LL*(r-l)/3,//三分
			D(s,p+g*m1,u+g*m1)<=D(s,p+g*m2,u+g*m2)?r=m2:l=m1;
		for(i=l;i<=r;++i) Gmin(d,D(s,p+g*i,u+g*i));//更新答案
		l=0,r=2e9;W(r-l>12) m1=l+(r-l)/3,m2=l+2LL*(r-l)/3,//三分
			D(s,u+g*m1,w+g*m1)<=D(s,u+g*m2,w+g*m2)?r=m2:l=m1;
		for(i=l;i<=r;++i) Gmin(d,D(s,u+g*i,w+g*i));//更新答案
		puts(d<=d1?"Dangerous":(d<=d2?"Perfect":"Miss"));//判断输出答案
	}return 0;
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值