| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
谁能告诉我为什么啊?我的程序样例过不了 但是AC了 说我排序的地方有问题,但是我检查了不知道为什么代码如下: 希望高手帮我看下 #include <cstdio> #include <cmath> #include <algorithm> using namespace std; #define MXN 205 const double eps = 1e-9; inline int sgn(double a) { if (fabs(a) < eps) return 0; return (a < 0)? -1 : 1; } #define ZERO(X) (sgn(X)==0) #define NEGA(X) (sgn(X)==-1) #define POSI(X) (sgn(X)==1) struct point { double x, y; point(): x(0), y(0) {} point(double a, double b): x(a), y(b) {} point operator-(const point &b) const { return point(x - b.x, y - b.y); } double operator*(const point &b) const { return x * b.y - y * b.x; } bool operator==(const point &b) const { return (ZERO(y - b.y) && ZERO(x - b.x)); } } P[MXN]; struct hvec { point s, t; double ang; point operator*(const hvec &b) const { double s1 = (b.t - s) * (b.s - s), s2 = (b.s - t) * (b.t - t); return point((s.x * s2 + t.x * s1) / (s2 + s1), (s.y * s2 + t.y * s1) / (s2 + s1)); } bool operator<(const hvec &b) const { if (ZERO(b.ang - ang)) return sgn((b.t - b.s) * (t - b.s)) >= 0; else return ang < b.ang; } } H[MXN], Q[MXN]; int N; inline bool isout(const hvec &h, const point &p) { return POSI((p - h.s) * (h.t - h.s)); } inline int hvec_int() { int M = 0, C = 1, l = 0, r = 1,i; sort(H + 1, H + N + 1); for (i = 2; i <= N; ++i) if (! ZERO(H[i].ang - H[i - 1].ang)) H[++C] = H[i]; Q[0] = H[1], Q[1] = H[2]; for (int i = 3; i <= C; ++i) { while (l < r && isout(H[i], Q[r] * Q[r - 1])) --r; while (l < r && isout(H[i], Q[l] * Q[l + 1])) ++l; Q[++r] = H[i]; } while (l < r && isout(Q[l], Q[r] * Q[r - 1])) --r; while (l < r && isout(Q[r], Q[l] * Q[l + 1])) ++l; if (r <= l + 1) return 0; for (i = l; i < r; ++i) P[++M] = Q[i] * Q[i + 1]; P[++M] = Q[l] * Q[r]; M = unique(P + 1, P + M + 1) - P - 1; return M; } void add_hvec(point s, point t) { H[++N].s = s, H[N].t = t; point c = t - s; H[N].ang = atan2(c.y, c.x); } int main() { int m,i,n,t; double x1, y1, x2, y2, x0, y0; scanf("%d",&t); while (t--) { scanf("%d",&n); N = 0; scanf("%lf %lf",&x0,&y0); x1 = x0,y1= y0; for (i = 1;i < n;i++) { scanf("%lf %lf",&x2,&y2); add_hvec(point(x2, y2), point(x1, y1)); x1 = x2,y1 = y2; } add_hvec(point(x0, y0), point(x1, y1)); m = hvec_int(); if (m == 0) printf("NO\n"); else printf("YES\n"); } return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator