bzoj 3800: Saber VS Lancer (半平面交求解不等式组)

3800: Saber VS Lancer

Time Limit: 1 Sec   Memory Limit: 64 MB
Submit: 71   Solved: 27
[ Submit][ Status][ Discuss]

Description

铁人三项是一种运动项目,和字面意思一样,是让铁做的人(?)去做三个项目,必须连续完成,而且全程讲求速度。第一项是游泳,第二项是骑自行车,第三项是跑步。现在所有选手的三个项目的速度都是已知的。但是这次比赛中,裁判可以任意选择每一个项目的路程长度(假设没有一项长度为0)。但是这样显然会影响比赛排名……有时她会按某种方式选择,使得一些个别的选手能赢得竞赛。

Input

首行为运动员的人数N (1 ≤ N ≤ 100,80%的数据中n<=20),以下N行,每行含3个整数,Vi, Ui 和Wi (1 ≤ Vi, Ui, Wi ≤ 10000),用空格隔开,表示各人3个项目的速度。 

Output

对于每个运动员,都用一行输出,假如裁判以某种方式选择的路程会使得他赢(即第一个冲线,同时抵达不算赢),则输出“Yes”,否则输出“No”  。

Sample Input

9
10 2 6
10 7 3
5 6 7
3 2 7
6 2 6
3 5 7
8 4 6
10 4 2
1 8 7

Sample Output

Yes
Yes
Yes
No
No
No
Yes
No
Yes

HINT

Source

[ Submit][ Status][ Discuss]

题解:半平面交求解不等式组

#include
#include
#include
#include
#include
#define N 103
#define eps 1e-16
#define inf 1000000000
using namespace std;
struct vector {
    double x,y;
    vector (double X=0,double Y=0){
        x=X,y=Y;
    }
}a1[N],p[N],tmp[N];
typedef vector point;
vector operator -(vector a,vector b){
    return vector (a.x-b.x,a.y-b.y);
}
vector operator +(vector a,vector b){
    return vector (a.x+b.x,a.y+b.y);
}
vector operator *(vector a,double t)
{
    return vector (a.x*t,a.y*t);
}
vector operator !=(vector a,vector b){
    return a.x!=b.x||a.y!=b.y;
}
struct data{
    point a,b;
}line[N];
double a[N],b[N],c[N];
int n,m;
void init()
{
    m=0;
    p[m++]=point(inf,inf);
    p[m++]=point(eps,inf);
    p[m++]=point(eps,eps);
    p[m++]=point(inf,eps);
}
int dcmp(double x)
{
    if (fabs(x)=0) 
          tmp[cnt++]=p[i];
        if (dcmp(c)*dcmp(d)<0) 
         tmp[cnt++]=glt(a,b,p[i],p[(i+1)%m]);
    }
    m=0;
    for (int i=0;i0) continue;
                else {
                    mark=false;
                    break;
                }
            }
            k++;
            if (dcmp(nowb)==0) {
                double t=-nowc/nowa;
                line[k].a.x=t; line[k].b.x=t;
                line[k].a.y=1; line[k].b.y=2;
                if (dcmp(nowa)>0) swap(line[k].a,line[k].b);
                continue;
            }
            line[k].a.x=1;
            line[k].a.y=-(nowa+nowc)/nowb;
            line[k].b.x=2;
            line[k].b.y=-(nowa*2.0+nowc)/nowb;
            if (dcmp(nowb)<0) swap(line[k].a,line[k].b);
        }
        if (!mark){
            printf("No\n");
            continue;
        }
        init();
        for (int  j=1;j<=k;j++)
         cut(line[j].a,line[j].b);
        double area=0; p[m]=p[0];
        for (int j=1;j2&&dcmp(area)>0) printf("Yes\n");
        else printf("No\n");
    }
}



你可能感兴趣的:(计算几何)