struct P { double x,y; P() {} P(double x, double y) { this->x = x; this->y = y; } P operator + (const P &c) const { return P(x + c.x, y + c.y); } P operator - (const P &c) const { return P(x - c.x, y - c.y); } P operator * (const db &c) const { return P(x * c, y * c); } P operator / (const db &c) const { return P(x / c, y / c); } }; int n; P p[N]; bool f[N][N]; ll dp[N][N]; P read() { double x, y;scanf("%lf%lf",&x,&y); return P(x, y); } void print(P p) { printf("%lf %lf ",p.x,p.y); } int sign(double x) { return (x>eps)-(x<-eps); } db dot(P a, P b) { return x(a) * x(b) + y(a) * y(b); } double cross(P a, P b) { return x(a) * y(b) - x(b) * y(a); } //判断线段是否规范相交(交点不在任一个端点上) bool isSS0(P a1, P a2, P b1, P b2) { double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1), c3 = cross(b2 - b1, a1 - b1), c4 = cross(b2 - b1, a2 - b1); return sign(c1) * sign(c2) < 0 && sign(c3) * sign(c4) < 0; } //判断线段是否不规范相交 bool isSS1(P a1, P a2, P b1, P b2) { double c1 = cross(a2 - a1, b1 - a1), c2 = cross(a2 - a1, b2 - a1), c3 = cross(b2 - b1, a1 - b1), c4 = cross(b2 - b1, a2 - b1); return sign(max(x(a1), x(a2)) - min(x(b1), x(b2))) >= 0 && sign(max(x(b1), x(b2)) - min(x(a1), x(a2))) >= 0 && sign(max(y(a1), y(a2)) - min(y(b1), y(b2))) >= 0 && sign(max(y(b1), y(b2)) - min(y(a1), y(a2))) >= 0 && sign(c1) * sign(c2) <= 0 && sign(c3) * sign(c4) <= 0; } //判断点是否在线段上(不包括端点) bool onS0(P p, P a, P b) { return sign(cross(p - a, b - a)) == 0 && sign(dot(p - a, p - b)) < 0; } //判断点是否在线段上(包括端点) bool onS1(P p, P a, P b) { return sign(cross(p - a, b - a)) == 0 && sign(dot(p - a, p - b)) <= 0; } //判断点和多边形关系 边上-1 外0 内1 int Pinploy(P o, P *p, int n) { int res = 0; rep(i, 0, n) { P u = p[i], v = p[(i + 1) % n]; if(onS1(o, u, v)) return -1; int k = sign(cross(v - u, o - u)); int d1 = sign(y(u) - y(o)); int d2 = sign(y(v) - y(o)); if(k > 0 && d1 <= 0 && d2 > 0) ++res; if(k < 0 && d2 <= 0 && d1 > 0) --res; } return res != 0; }