Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

谁能告诉我为什么啊?我的程序样例过不了 但是AC了 说我排序的地方有问题,但是我检查了不知道为什么

Posted by ylllxw08 at 2011-07-16 20:44:32 on Problem 3335
代码如下:   希望高手帮我看下
#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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator