// OB会夏合宿2011 Day3 I : White Bird #include #include #include using namespace std; const double EPS = 1e-8; // y方向の速度をvyとして発射し、点(X,Y)を通る時の、X, Y, V, vyの関係式 // この式を0とするvyの値を求めるために使用 double calc(double X, double Y, double V, double vy){ return 2*vy*sqrt(V*V-vy*vy)*X-9.8*X*X-2*Y*(V*V-vy*vy); } // 点(X, Y)を通るようなy方向の初期速度を求める void getVy(vector &vd, double X, double Y, double V){ // 3分探索で、x座標がXの時のy座標が最大になるときのy方向速度を求める double L = 0, R = V; for(int cnt=0;cnt<200;cnt++){ double midA = (2*L+R)/3; double midB = (L+2*R)/3; if(calc(X, Y, V, midA) < calc(X, Y, V, midB)) L = midA; else R = midB; } // 最大高さでもYを超えない場合は条件を満たす速度がない if(calc(X, Y, V, 0.5*(L+R)) < EPS) return ; // 2分探索で、[0, 0.5*(L+R)]間の解を探す. // calc(X, Y, V, 0) < 0 かつ 0 < calc(X, Y, V, 0.5*(L+R)) なのでこの区間に解を持つ double vl = 0, vr = 0.5*(L+R); for(int cnt=0;cnt<200;cnt++){ double mid = 0.5*(vl+vr); if(calc(X, Y, V, mid) < 0) vl = mid; else vr = mid; } vd.push_back(0.5*(vl+vr)); // 2分探索で、[0.5*(L+R), V]間の解を探す. vl = 0.5*(L+R), vr = V; for(int cnt=0;cnt<200;cnt++){ double mid = 0.5*(vl+vr); if(calc(X, Y, V, mid) > 0) vl = mid; else vr = mid; } vd.push_back(0.5*(vl+vr)); } int main(){ int N, V, X, Y; int L[50], B[50], R[50], T[50]; while(cin >> N >> V >> X >> Y){ vector vd; // 点(X, Y)を通る時のy方向初期速度を求める getVy(vd, X, Y, V); // white birdはx座標がXのときy座標が[low, high]の間に収まる軌跡であれば良い int low = Y, high = 1000000007; for(int i=0;i> L[i] >> B[i] >> R[i] >> T[i]; // (X,Y)より右側にある障害物は無視 L[i] = min(L[i], X); R[i] = min(R[i], X); // 障害物の各頂点を通る時のy方向初期速度を求める getVy(vd, L[i], B[i], V); getVy(vd, R[i], B[i], V); getVy(vd, L[i], T[i], V); getVy(vd, R[i], T[i], V); // (X, Y)の上側に存在する障害物を考慮 if(L[i]<=X&&X<=R[i]&&B[i]>=high) high = min(high, B[i]); } bool clear = false; for(int i=0;i My) swap(my, My); // 障害物のある区間が放物線の頂点を含む場合 if(L[j]+EPS < vx*vy/9.8 && vx*vy/9.8 < R[j]-EPS) My = vy*(vy/9.8) - 4.9*(vy/9.8)*(vy/9.8); if(min(My, (double)T[j]) - max(my, (double)B[j]) > EPS) ok = false; } if(!ok) continue; // 障害物とぶつからなければクリア判定 double y = vy*(X/vx) - 4.9*(X/vx)*(X/vx); if(low-EPS < y && y < high+EPS) clear = true; } cout << (clear ? "Yes" : "No") << endl; } }