2010-1121
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
题目类型:
几何、物理、模拟
题目大意:
足球射门练习。每一个CASE给出足球起点坐标,初速度大小,初速度方向,问球能不能进。
解题思路:
由于不考虑空气阻力,只考虑弹地后的速度损失,若竖直方向速度分量为0,则球做匀速直线运动。
利用模拟法,根据当前弹地后的速度,计算出下一次弹地的位置。判断这个线段是否与球门线相交,若相交,求出交点,根据交点算出该点高度,判断是否在门框内;若不相交,继续求下一次落地。直到球出界或速度减为0。
代码:
{{{
#include "cstdio"
#include "iostream"
#include "cstring"
#include "cstdlib"
#include "algorithm"
#include "cmath"
using namespace std;
const double EPS = 1e-8;
struct Point {
double x, y;
};
struct Line {
Point a, b;
};
inline bool zero(double x) {
return ((x > 0 ? x : -x) < EPS);
}
//?? cross product (P1 - P0)x(P2 - P0)
inline double xmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline double xmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);
}
//?? dot product (P1 - P0).(P2 - P0)
inline double dmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
inline double dmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0);
}
//????
inline double dis(const Point & p1, const Point & p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
inline double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
//?????
bool dotsInline(const Point & p1, const Point & p2, const Point & p3) {
return zero(xmult(p1, p2, p3));
}
bool dotsInline(double x1, double y1, double x2, double y2, double x3, double y3) {
return zero(xmult(x1, y1, x2, y2, x3, y3));
}
//????????, ????
bool dotOnlineIn(const Point & p, const Line & l) {
return zero(xmult(p, l.a, l.b)) && (l.a.x - p.x) * (l.b.x - p.x) < EPS && (l.a.
y - p.y) * (l.b.y - p.y) < EPS;
}
bool dotOnlineIn(const Point & p, const Point & l1, const Point & l2) {
return zero(xmult(p, l1, l2)) && (l1.x - p.x) * (l2.x - p.x) < EPS && (l1.y - p
.y) * (l2.y - p.y) < EPS;
}
bool dotOnlineIn(double x, double y, double x1, double y1, double x2, double y2) {
return zero(xmult(x, y, x1, y1, x2, y2)) && (x1 - x) * (x2 - x) < EPS && (y1 -
y) * (y2 - y) < EPS;
}
//????????, ?????
bool dotOnlineEx(const Point & p, const Line & l) {
return dotOnlineIn(p, l) && (!zero(p.x - l.a.x) || !zero(p.y - l.a.y)) && (!zero(p.x - l.b.x) || !zero(p.y - l.b.y));
}
bool dotOnlineEx(const Point & p, const Point & l1, const Point & l2) {
return dotOnlineIn(p, l1, l2) && (!zero(p.x - l1.x) || !zero(p.y - l1.y)) && (!
zero(p.x - l2.x) || !zero(p.y - l2.y));
}
bool dotOnlineEx(double x, double y, double x1, double y1, double x2, double y2) {
return dotOnlineIn(x, y, x1, y1, x2, y2) && (!zero(x - x1) || !zero(y - y1)) &&
(!zero(x - x2) || !zero(y - y2));
}
//????????, ??????? 0
bool sameSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) > EPS;
}
bool sameSide(const Point & p1, const Point & p2, const Point & l1, const Point & l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) > EPS;
}
//????????, ??????? 0
bool oppositeSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) < -EPS;
}
bool oppositeSide(const Point & p1, const Point & p2, const Point & l1, const Point
& l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) < -EPS;
}
//??????
bool parallel(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.y - v.b.y) - (v.a.x - v.b.x) * (u.a.y - u.b.
y));
}
bool parallel(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.y - v2.y) - (v1.x - v2.x) * (u1.y - u2.y));
}
//??????
bool perpendicular(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.x - v.b.x) + (u.a.y - u.b.y) * (v.a.y - v.b.
y));
}
bool perpendicular(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.x - v2.x) + (u1.y - u2.y) * (v1.y - v2.y));
}
//??????, ?????????
bool intersectIn(const Line & u, const Line & v) {
if (!dotsInline(u.a, u.b, v.a) || !dotsInline(u.a, u.b, v.b)) {
return !sameSide(u.a, u.b, v) && !sameSide(v.a, v.b, u);
} else {
return dotOnlineIn(u.a, v) || dotOnlineIn(u.b, v) || dotOnlineIn(v.a, u) ||
dotOnlineIn(v.b, u);
}
}
bool intersectIn(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
if (!dotsInline(u1, u2, v1) || !dotsInline(u1, u2, v2)) {
return !sameSide(u1, u2, v1, v2) && !sameSide(v1, v2, u1, u2);
} else {
return dotOnlineIn(u1, v1, v2) || dotOnlineIn(u2, v1, v2) || dotOnlineIn(v1
, u1, u2) || dotOnlineIn(v2, u1, u2);
}
}
//??????, ??????????
bool intersectEx(const Line & u, const Line & v) {
return oppositeSide(u.a, u.b, v) && oppositeSide(v.a, v.b, u);
}
bool intersectEx(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
return oppositeSide(u1, u2, v1, v2) && oppositeSide(v1, v2, u1, u2);
}
//???????, ????????????!
//????????????(???????????!)
Point intersection(const Line & u, const Line & v) {
Point ret = u.a;
double t = ((u.a.x - v.a.x) * (v.a.y - v.b.y) - (u.a.y - v.a.y) * (v.a.x - v.b.
x)) / ((u.a.x - u.b.x) * (v.a.y - v.b.y) - (u.a.y - u.b.y) * (v.a.x - v.b.x));
ret.x += (u.b.x - u.a.x) * t;
ret.y += (u.b.y - u.a.y) * t;
return ret;
}
Point intersection(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
Point ret = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) / ((
u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ret.x += (u2.x - u1.x) * t;
ret.y += (u2.y - u1.y) * t;
return ret;
}
//?????????
Point ptoline(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
return intersection(p, t, l.a, l.b);
}
Point ptoline(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
return intersection(p, t, l1, l2);
}
//??????
double disptoline(const Point & p, const Line & l) {
return fabs(xmult(p, l.a, l.b)) / dis(l.a, l.b);
}
double disptoline(const Point & p, const Point & l1, const Point & l2) {
return fabs(xmult(p, l1, l2)) / dis(l1, l2);
}
double disptoline(double x, double y, double x1, double y1, double x2, double y2) {
return fabs(xmult(x, y, x1, y1, x2, y2)) / dis(x1, y1, x2, y2);
}
//?????????
Point ptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? l.a : l.b;
} else {
return intersection(p, t, l.a, l.b);
}
}
Point ptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? l1 : l2;
} else {
return intersection(p, t, l1, l2);
}
}
//??????
double disptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? dis(p, l.a) : dis(p, l.b);
} else {
return fabs(xmult(p, l.a, l.b))/dis(l.a, l.b);
}
}
double disptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? dis(p, l1) : dis(p, l2);
} else {
return fabs(xmult(p, l1, l2))/dis(l1, l2);
}
}
//?? V ? P ???????? angle ??? scale ?
Point rotate(Point v, Point p, double angle, double scale) {
Point ret = p;
v.x -= p.x;
v.y -= p.y;
p.x = scale * cos(angle);
p.y = scale * sin(angle);
ret.x += v.x * p.x - v.y * p.y;
ret.y += v.x * p.y + v.y * p.x;
return ret;
}
int main()
{
int casenum=0;
double x0,y0,x00,y00,x1,y1,t,v,x,y,z;
double g=9.80665;
Point gg1,gg2;
gg1.x = 68/2-7.32/2;
gg1.y = 0;
gg2.x = 68/2+7.32/2;
gg2.y = 0;
Line ggl;
ggl.a=gg1;
ggl.b=gg2;
while (scanf("%lf%lf", &x00, &y00)!=EOF)
{
casenum++;
printf("Case #%d:\n", casenum);
int nn;
scanf("%d", &nn);
for (int ii=1;ii<=nn;ii++)
{
printf("Shot %d: ", ii);
int flag =0;
x0=x00;
y0=y00;
scanf("%lf%lf%lf%lf", &v, &x, &y, &z);
while (v>1e-8 && flag==0)
{
double temp = sqrt(x*x+y*y+z*z);
t = 2*v*z/temp/g;
x1 = x0+x/temp * v *t;
// cout << x << "||" << temp << "||" << v<< "||" << t << endl;
y1 = y0+y/temp * v *t;
if (z==0)
{
x1 = x0+100/temp*x;
y1 = y0+100/temp*y;
}
Point p1,p2;
p1.x = x0;
p1.y = y0;
// cout << x0 << " " << y0 << " --> ";
// cout << x1 << " " << y1 <<endl;
p2.x = x1;
p2.y = y1;
Line l;
l.a =p1;
l.b =p2;
if (intersectIn(l,ggl))
{
// cout << "!!" << x1 << " " << y1 <<endl;
double tt;
if (y1!=y0)
{
tt = t * (0-y0) /(y1-y0);
}
double h=v*z/temp*tt-0.5*g*tt*tt;
if (h<=2.44)
flag =1;
else
flag =-1;
if (y1==y0) flag = 1;
}
else
{
if (x1<0 || x1>68 || y1<0 || y1>105)
{
// cout << "!!" << x1 << " " << y1 <<endl;
flag = -1;
}
// cout << "!!" << x1 << " " << y1 <<endl;
x0 = x1;
y0 = y1;
v /= 2;
// cout << "!!" << flag << " " << v <<endl;
}
}
if (flag==1)
puts("yes");
else
puts("no");
}
}
}
}}}
题目类型:
几何、物理、模拟
题目大意:
足球射门练习。每一个CASE给出足球起点坐标,初速度大小,初速度方向,问球能不能进。
解题思路:
由于不考虑空气阻力,只考虑弹地后的速度损失,若竖直方向速度分量为0,则球做匀速直线运动。
利用模拟法,根据当前弹地后的速度,计算出下一次弹地的位置。判断这个线段是否与球门线相交,若相交,求出交点,根据交点算出该点高度,判断是否在门框内;若不相交,继续求下一次落地。直到球出界或速度减为0。
代码:
#include "cstdio"
#include "iostream"
#include "cstring"
#include "cstdlib"
#include "algorithm"
#include "cmath"
using namespace std;
const double EPS = 1e-8;
struct Point {
double x, y;
};
struct Line {
Point a, b;
};
inline bool zero(double x) {
return ((x > 0 ? x : -x) < EPS);
}
//?? cross product (P1 - P0)x(P2 - P0)
inline double xmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline double xmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0);
}
//?? dot product (P1 - P0).(P2 - P0)
inline double dmult(const Point & p1, const Point & p2, const Point & p0) {
return (p1.x - p0.x) * (p2.x - p0.x) + (p1.y - p0.y) * (p2.y - p0.y);
}
inline double dmult(double x1, double y1, double x2, double y2, double x0, double y0) {
return (x1 - x0) * (x2 - x0) + (y1 - y0) * (y2 - y0);
}
//????
inline double dis(const Point & p1, const Point & p2) {
return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
inline double dis(double x1, double y1, double x2, double y2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
}
//?????
bool dotsInline(const Point & p1, const Point & p2, const Point & p3) {
return zero(xmult(p1, p2, p3));
}
bool dotsInline(double x1, double y1, double x2, double y2, double x3, double y3) {
return zero(xmult(x1, y1, x2, y2, x3, y3));
}
//????????, ????
bool dotOnlineIn(const Point & p, const Line & l) {
return zero(xmult(p, l.a, l.b)) && (l.a.x - p.x) * (l.b.x - p.x) < EPS && (l.a.
y - p.y) * (l.b.y - p.y) < EPS;
}
bool dotOnlineIn(const Point & p, const Point & l1, const Point & l2) {
return zero(xmult(p, l1, l2)) && (l1.x - p.x) * (l2.x - p.x) < EPS && (l1.y - p
.y) * (l2.y - p.y) < EPS;
}
bool dotOnlineIn(double x, double y, double x1, double y1, double x2, double y2) {
return zero(xmult(x, y, x1, y1, x2, y2)) && (x1 - x) * (x2 - x) < EPS && (y1 -
y) * (y2 - y) < EPS;
}
//????????, ?????
bool dotOnlineEx(const Point & p, const Line & l) {
return dotOnlineIn(p, l) && (!zero(p.x - l.a.x) || !zero(p.y - l.a.y)) && (!zero(p.x - l.b.x) || !zero(p.y - l.b.y));
}
bool dotOnlineEx(const Point & p, const Point & l1, const Point & l2) {
return dotOnlineIn(p, l1, l2) && (!zero(p.x - l1.x) || !zero(p.y - l1.y)) && (!
zero(p.x - l2.x) || !zero(p.y - l2.y));
}
bool dotOnlineEx(double x, double y, double x1, double y1, double x2, double y2) {
return dotOnlineIn(x, y, x1, y1, x2, y2) && (!zero(x - x1) || !zero(y - y1)) &&
(!zero(x - x2) || !zero(y - y2));
}
//????????, ??????? 0
bool sameSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) > EPS;
}
bool sameSide(const Point & p1, const Point & p2, const Point & l1, const Point & l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) > EPS;
}
//????????, ??????? 0
bool oppositeSide(const Point & p1, const Point & p2, const Line & l) {
return xmult(l.a, p1, l.b) * xmult(l.a, p2, l.b) < -EPS;
}
bool oppositeSide(const Point & p1, const Point & p2, const Point & l1, const Point
& l2) {
return xmult(l1, p1, l2) * xmult(l1, p2, l2) < -EPS;
}
//??????
bool parallel(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.y - v.b.y) - (v.a.x - v.b.x) * (u.a.y - u.b.
y));
}
bool parallel(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.y - v2.y) - (v1.x - v2.x) * (u1.y - u2.y));
}
//??????
bool perpendicular(const Line & u, const Line & v) {
return zero((u.a.x - u.b.x) * (v.a.x - v.b.x) + (u.a.y - u.b.y) * (v.a.y - v.b.
y));
}
bool perpendicular(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
return zero((u1.x - u2.x) * (v1.x - v2.x) + (u1.y - u2.y) * (v1.y - v2.y));
}
//??????, ?????????
bool intersectIn(const Line & u, const Line & v) {
if (!dotsInline(u.a, u.b, v.a) || !dotsInline(u.a, u.b, v.b)) {
return !sameSide(u.a, u.b, v) && !sameSide(v.a, v.b, u);
} else {
return dotOnlineIn(u.a, v) || dotOnlineIn(u.b, v) || dotOnlineIn(v.a, u) ||
dotOnlineIn(v.b, u);
}
}
bool intersectIn(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
if (!dotsInline(u1, u2, v1) || !dotsInline(u1, u2, v2)) {
return !sameSide(u1, u2, v1, v2) && !sameSide(v1, v2, u1, u2);
} else {
return dotOnlineIn(u1, v1, v2) || dotOnlineIn(u2, v1, v2) || dotOnlineIn(v1
, u1, u2) || dotOnlineIn(v2, u1, u2);
}
}
//??????, ??????????
bool intersectEx(const Line & u, const Line & v) {
return oppositeSide(u.a, u.b, v) && oppositeSide(v.a, v.b, u);
}
bool intersectEx(const Point & u1, const Point & u2, const Point & v1, const Point
& v2) {
return oppositeSide(u1, u2, v1, v2) && oppositeSide(v1, v2, u1, u2);
}
//???????, ????????????!
//????????????(???????????!)
Point intersection(const Line & u, const Line & v) {
Point ret = u.a;
double t = ((u.a.x - v.a.x) * (v.a.y - v.b.y) - (u.a.y - v.a.y) * (v.a.x - v.b.
x)) / ((u.a.x - u.b.x) * (v.a.y - v.b.y) - (u.a.y - u.b.y) * (v.a.x - v.b.x));
ret.x += (u.b.x - u.a.x) * t;
ret.y += (u.b.y - u.a.y) * t;
return ret;
}
Point intersection(const Point & u1, const Point & u2, const Point & v1, const Point & v2) {
Point ret = u1;
double t = ((u1.x - v1.x) * (v1.y - v2.y) - (u1.y - v1.y) * (v1.x - v2.x)) / ((
u1.x - u2.x) * (v1.y - v2.y) - (u1.y - u2.y) * (v1.x - v2.x));
ret.x += (u2.x - u1.x) * t;
ret.y += (u2.y - u1.y) * t;
return ret;
}
//?????????
Point ptoline(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
return intersection(p, t, l.a, l.b);
}
Point ptoline(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
return intersection(p, t, l1, l2);
}
//??????
double disptoline(const Point & p, const Line & l) {
return fabs(xmult(p, l.a, l.b)) / dis(l.a, l.b);
}
double disptoline(const Point & p, const Point & l1, const Point & l2) {
return fabs(xmult(p, l1, l2)) / dis(l1, l2);
}
double disptoline(double x, double y, double x1, double y1, double x2, double y2) {
return fabs(xmult(x, y, x1, y1, x2, y2)) / dis(x1, y1, x2, y2);
}
//?????????
Point ptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? l.a : l.b;
} else {
return intersection(p, t, l.a, l.b);
}
}
Point ptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? l1 : l2;
} else {
return intersection(p, t, l1, l2);
}
}
//??????
double disptoseg(const Point & p, const Line & l) {
Point t = p;
t.x += l.a.y - l.b.y;
t.y += l.b.x - l.a.x;
if (xmult(l.a, t, p) * xmult(l.b, t, p) > EPS) {
return dis(p, l.a) < dis(p, l.b) ? dis(p, l.a) : dis(p, l.b);
} else {
return fabs(xmult(p, l.a, l.b))/dis(l.a, l.b);
}
}
double disptoseg(const Point & p, const Point & l1, const Point & l2) {
Point t = p;
t.x += l1.y - l2.y;
t.y += l2.x - l1.x;
if (xmult(l1, t, p) * xmult(l2, t, p) > EPS) {
return dis(p, l1) < dis(p, l2) ? dis(p, l1) : dis(p, l2);
} else {
return fabs(xmult(p, l1, l2))/dis(l1, l2);
}
}
//?? V ? P ???????? angle ??? scale ?
Point rotate(Point v, Point p, double angle, double scale) {
Point ret = p;
v.x -= p.x;
v.y -= p.y;
p.x = scale * cos(angle);
p.y = scale * sin(angle);
ret.x += v.x * p.x - v.y * p.y;
ret.y += v.x * p.y + v.y * p.x;
return ret;
}
int main()
{
int casenum=0;
double x0,y0,x00,y00,x1,y1,t,v,x,y,z;
double g=9.80665;
Point gg1,gg2;
gg1.x = 68/2-7.32/2;
gg1.y = 0;
gg2.x = 68/2+7.32/2;
gg2.y = 0;
Line ggl;
ggl.a=gg1;
ggl.b=gg2;
while (scanf("%lf%lf", &x00, &y00)!=EOF)
{
casenum++;
printf("Case #%d:\n", casenum);
int nn;
scanf("%d", &nn);
for (int ii=1;ii<=nn;ii++)
{
printf("Shot %d: ", ii);
int flag =0;
x0=x00;
y0=y00;
scanf("%lf%lf%lf%lf", &v, &x, &y, &z);
while (v>1e-8 && flag==0)
{
double temp = sqrt(x*x+y*y+z*z);
t = 2*v*z/temp/g;
x1 = x0+x/temp * v *t;
// cout << x << "||" << temp << "||" << v<< "||" << t << endl;
y1 = y0+y/temp * v *t;
if (z==0)
{
x1 = x0+100/temp*x;
y1 = y0+100/temp*y;
}
Point p1,p2;
p1.x = x0;
p1.y = y0;
// cout << x0 << " " << y0 << " --> ";
// cout << x1 << " " << y1 <<endl;
p2.x = x1;
p2.y = y1;
Line l;
l.a =p1;
l.b =p2;
if (intersectIn(l,ggl))
{
// cout << "!!" << x1 << " " << y1 <<endl;
double tt;
if (y1!=y0)
{
tt = t * (0-y0) /(y1-y0);
}
double h=v*z/temp*tt-0.5*g*tt*tt;
if (h<=2.44)
flag =1;
else
flag =-1;
if (y1==y0) flag = 1;
}
else
{
if (x1<0 || x1>68 || y1<0 || y1>105)
{
// cout << "!!" << x1 << " " << y1 <<endl;
flag = -1;
}
// cout << "!!" << x1 << " " << y1 <<endl;
x0 = x1;
y0 = y1;
v /= 2;
// cout << "!!" << flag << " " << v <<endl;
}
}
if (flag==1)
puts("yes");
else
puts("no");
}
}
}