| ||||||||||
| 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