http://acm.pku.edu.cn/JudgeOnline/problem?id=2653
我明明越界,pku 给tle... 害的我一顿改。就是不过。还以为模板有问题
#include <stdio.h>
#define FOR(i,s,e) for (int (i)=(s); (i) < (e);i++)
inline double max(double a, double b) {return a > b ? a : b;}
inline double min(double a, double b) {return a < b ? a : b;}
struct POINT
{
double x;
double y;
POINT(double a=0, double b=0) { x=a; y=b;} //constructor
};
struct LINESEG
{
POINT s;
POINT e;
LINESEG(POINT a, POINT b) { s=a; e=b;}
LINESEG() { }
};
struct NODE
{
LINESEG line;
int num;
};
const double INF = 1E20;
const double EP = 1E-9;
const int MAXV = 300;
const double PI = 3.14159265;
inline double multiply(POINT sp, POINT ep, POINT op)
{
return ((sp.x-op.x)*(ep.y-op.y) - (ep.x-op.x)*(sp.y-op.y) );
}
bool intersect(LINESEG u,LINESEG v)
{
return (max(u.s.x,u.e.x) >= min (v.s.x,v.e.x)) &&
(max(v.s.x,v.e.x) >= min(u.s.x,u.e.x)) &&
(max(u.s.y,u.e.y) >= min(v.s.y,v.e.y )) &&
(max(v.s.y,v.e.y) >= min(u.s.y,u.e.y)) &&
(multiply(v.s,u.e,u.s) * multiply(u.e,v.e,u.s) >=0) &&
(multiply(u.s,v.e,v.s) * multiply(v.e,u.e,v.s) >=0 );
}
LINESEG line[100010];
int n;
int main()
{
// freopen("in.txt","r",stdin);
int n;
while (scanf("%d",&n)&n>0)
{
int sum = 0;
FOR(i,0,n)
scanf("%lf%lf%lf%lf",&line[i].s.x, &line[i].s.y, &line[i].e.x, &line[i].e.y);
if(n<=1)
{
puts("Top sticks: 1");
continue;
}
printf("Top sticks:");
FOR(i,0,n-1)
{
bool sign = false;
FOR(j,i+1,n)
if (intersect(line[i],line[j]))
{sign=true;break;}
if (!sign)
printf(" %d,",i+1);
}
printf(" %d.\n",n);
}
return 0;
}