mirror of
https://github.com/Kiritow/OJ-Problems-Source.git
synced 2024-03-22 13:11:29 +08:00
55762be649
2400-2499
111 lines
3.6 KiB
C++
111 lines
3.6 KiB
C++
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
#include <string.h>
|
|
#include <ctype.h>
|
|
#include <time.h>
|
|
#include <iostream>
|
|
#include <algorithm>
|
|
#include <queue>
|
|
#include <vector>
|
|
#include <map>
|
|
#include <set>
|
|
#include <stack>
|
|
#include <list>
|
|
#include <string>
|
|
using namespace std;
|
|
#define INF 0x7F7F7F7F
|
|
#define eps 1e-8
|
|
typedef long long LL;
|
|
typedef vector<int> VI;
|
|
typedef vector<string> VS;
|
|
typedef pair <int , int> PII;
|
|
#define PB push_back
|
|
#define MP make_pair
|
|
#define CL(a,b) memset ( a , b , sizeof ( a ) )
|
|
#define CLN(a,n,b) memset ( a , b , n * sizeof ( size ) )
|
|
#define FOR(a,b,i) for ( i = a ; i < b ; i++ )
|
|
#define REP(i,n) FOR ( 0 , n , i )
|
|
#define FORB(b,a,i) for ( i = b ; i > a ; i-- )
|
|
#define FORE(a,b,i) for ( i = a ; i <= b ; i++ )
|
|
#define FOREB(b,a,i) for ( i = b ; i >= a ; i-- )
|
|
#define COPY(a,b,lt,rt,i) for ( i = lt ; i <= rt ; i++ ) a[i] = b[i];
|
|
#define sqr(a,b) sqrt ( (double) (a) * (a) + (double) (b) * (b) )
|
|
template <class T> inline T INT_LEN( T v ) { int len = 1 ; while ( v /= 10 ) ++len; return len; }
|
|
template <class T> inline double DIS ( T a , T b ) { return sqr ( a.x - b.x , a.y - b.y ); }
|
|
typedef struct {
|
|
double x , y;
|
|
}tc;
|
|
tc w[2] , t[2];
|
|
double vw , vt , mn , mx;
|
|
bool input (){
|
|
while ( ~scanf ( "%lf" , &w[0].x ) ){
|
|
scanf ( "%lf%lf%lf%lf" , &w[0].y , &w[1].x , &w[1].y , &vw );
|
|
scanf ( "%lf%lf%lf%lf%lf" , &t[0].x , &t[0].y , &t[1].x , &t[1].y , &vt );
|
|
scanf ( "%lf%lf" , &mn , &mx );
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
template < typename T >
|
|
double dot ( T a , T b , T c ){
|
|
return ( b.x - a.x ) * ( c.x - a.x ) + ( b.y - a.y ) * ( c.y - a.y );
|
|
}
|
|
template < typename T >
|
|
double det ( T a , T b , T c ){
|
|
return ( b.x - a.x ) * ( c.y - a.y ) - ( b.y - a.y ) * ( c.x - a.x );
|
|
}
|
|
double get_dis ( tc fro , tc to , tc o , double dx , double dy ){
|
|
fro.x += dx , fro.y += dy;
|
|
to.x += dx , to.y += dy;
|
|
double dis1 = DIS ( o , fro );
|
|
double dis2 = DIS ( o , to );
|
|
double d = min ( dis1 , dis2 );
|
|
double di = DIS ( fro , to );
|
|
if ( di <= eps ){
|
|
return d;
|
|
}else if ( dot ( fro , o , to ) >= -eps && dot ( to , o , fro ) >= -eps ){
|
|
return fabs ( det ( fro , to , o ) ) / di;
|
|
}else {
|
|
return d;
|
|
}
|
|
}
|
|
double calc ( tc fro , tc to , tc o , double dx , double dy){
|
|
int lt = 0 , rt = INF , mid;
|
|
double dis1 , dis2;
|
|
while ( lt <= rt ){
|
|
mid = ( lt + rt ) >> 1;
|
|
dis1 = get_dis ( fro , to , o , dx * mid , dy * mid );
|
|
dis2 = get_dis ( fro , to , o , dx * -~mid , dy * -~mid );
|
|
if ( dis1 <= dis2 + eps ) rt = ~-mid;
|
|
else lt = -~mid;
|
|
}
|
|
return get_dis ( fro , to , o , dx * lt , dy * lt );
|
|
}
|
|
void solve (){
|
|
tc tg , wg , p1 , p2;
|
|
double L1 = DIS ( t[0] , t[1] );
|
|
tg.x = ( t[1].x - t[0].x ) * vt / L1;
|
|
tg.y = ( t[1].y - t[0].y ) * vt / L1;
|
|
double L2 = DIS ( w[0] , w[1] );
|
|
wg.x = ( w[1].x - w[0].x ) * vw / L2;
|
|
wg.y = ( w[1].y - w[0].y ) * vw / L2;
|
|
double time = L1 / vt;
|
|
p1.x = t[0].x + ( tg.x - wg.x ) * time;
|
|
p1.y = t[0].y + ( tg.y - wg.y ) * time;
|
|
p2.x = p1.x + ( -tg.x - wg.x ) * time;
|
|
p2.y = p1.y + ( -tg.y - wg.y ) * time;
|
|
double d1 = calc ( t[0] , p1 , w[0] , p2.x - t[0].x , p2.y - t[0].y );
|
|
double d2 = calc ( p1 , p2 , w[0] , p2.x - t[0].x , p2.y - t[0].y );
|
|
double d = min ( d1 , d2 );
|
|
if ( d + eps < mn ) puts ( "Dangerous" );
|
|
else if ( d - eps > mx ) puts ( "Miss" );
|
|
else puts ( "Perfect" );
|
|
}
|
|
int main (void){
|
|
while ( input () ){
|
|
solve ();
|
|
}
|
|
return 0;
|
|
}
|