http://poj.org/problem?id=1755

题意:铁人三项,每个人有自己在每一段的速度,求有没有一种3条路线长度都不为0的设计使得某个人能严格获胜?

我们枚举每个人获胜,得到不等式组:s1/v1+s2/v2+s3/v3<s1/v1'+s2/v2'+s3/v3' 是三维半平面交?接着看

我们令两边同时除以s3得到

(s1/s3)*(1/v1)+(s2/s3)*(1/v2)+(1/v3)<(s1/s3)*(1/v1')+(s2/s3)*(1/v2')+(1/v3')

这样s1/s3和s2/s3就变成了唯二的变量了,这样不等式组就变成了二元一次不等式组了,用半平面交就可以解决了。

注意有些地方:

eps要设置到1e-16

如果一个人有2个速度和另一个人相等,直接特判掉第三个,不建直线。

#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
const double eps=1e-;
const double inf=;
struct Point{
double x,y;
Point(){}
Point(double x0,double y0):x(x0),y(y0){}
}p[];
struct Line{
Point s,e;
double slop;
Line(){}
Line(Point s0,Point e0):s(s0),e(e0){}
}l[],c[];
int tot,n,v1[],v2[],v3[],num[];
int sgn(double x){
if (x>eps) return ;
if (x<-eps) return -;
return ;
}
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
double operator *(Point p1,Point p2){
return p1.x*p2.y-p1.y*p2.x;
}
Point operator -(Point p1,Point p2){
return Point(p1.x-p2.x,p1.y-p2.y);
}
bool pd(int id){
for (int i=;i<=n;i++)
if (i!=id)
{
int cnt=,ans1=,ans2=;
if (v1[i]==v1[id]) cnt++;
else ans1=v1[id],ans2=v1[i];
if (v2[i]==v2[id]) cnt++;
else ans1=v2[id],ans2=v2[i];
if (v3[i]==v3[id]) cnt++;
else ans1=v3[id],ans2=v3[i];
if (cnt==) return ;
else if (cnt==){
if (ans1<=ans2) return ;
}
num[i]=cnt;
}
return ;
}
void build(int id){
tot=;
l[++tot].s=Point(,inf);l[tot].e=Point(,);
l[++tot].s=Point(,);l[tot].e=Point(inf,);
l[++tot].s=Point(inf,);l[tot].e=Point(,inf);
for (int i=;i<=n;i++)
if (i!=id){
if (num[i]==) continue;
tot++;
double A=((double)v1[i]-v1[id])/((double)v1[id]*v1[i]);
double B=((double)v2[i]-v2[id])/((double)v2[id]*v2[i]);
double C=((double)v3[i]-v3[id])/((double)v3[id]*v3[i]);
int a=sgn(A),b=sgn(B),c=sgn(C);
if (a==){
l[tot].s.x=-;l[tot].s.y=(-C)/B;
l[tot].e.x=;l[tot].e.y=(-C)/B;
if (b>) std::swap(l[tot].s,l[tot].e);
}else if (b==){
l[tot].s=Point((-C)/A,-);
l[tot].e=Point((-C)/A,);
if (a<) std::swap(l[tot].s,l[tot].e);
}else{
l[tot].s=Point(-,-((-)*A+C)/B);
l[tot].e=Point(,-(A+C)/B);
if (b>) std::swap(l[tot].s,l[tot].e);
}
}
for (int i=;i<=tot;i++)
l[i].slop=atan2(l[i].e.y-l[i].s.y,l[i].e.x-l[i].s.x);
}
Point inter(Line p1,Line p2){
double k1=(p2.e-p1.s)*(p1.e-p1.s);
double k2=(p1.e-p1.s)*(p2.s-p1.s);
double t=(k2)/(k1+k2);
double x=p2.s.x+(p2.e.x-p2.s.x)*t;
double y=p2.s.y+(p2.e.y-p2.s.y)*t;
return Point(x,y);
}
bool jud(Line p1,Line p2,Line p3){
Point p=inter(p1,p2);
return (p-p3.s)*(p3.e-p3.s)>=eps;
}
bool cmp(Line p1,Line p2){
if (fabs(p1.slop-p2.slop)<=eps) return (p1.e-p1.s)*(p2.e-p1.s)<=;
else return p1.slop<p2.slop;
}
bool phi(){
int cnt=;
std::sort(l+,l++tot,cmp);
for (int i=;i<=tot;i++)
if (fabs(l[i].slop-l[i-].slop)>eps) l[++cnt]=l[i];
int L=,R=;c[]=l[];c[]=l[];
for (int i=;i<=cnt;i++){
while (L<R&&jud(c[R],c[R-],l[i])) R--;
while (L<R&&jud(c[L],c[L+],l[i])) L++;
c[++R]=l[i];
}
while (L<R&&jud(c[R],c[R-],c[L])) R--;
while (L<R&&jud(c[L],c[L+],c[R])) L++;
if (R-L+<) return ;
c[R+]=c[L];
cnt=;
for (int i=L;i<=R;i++)
p[++cnt]=inter(c[i],c[i+]);
p[cnt+]=p[];
double res=;
for (int i=;i<=cnt;i++)
res+=p[i]*p[i+];
res/=2.0;
res=fabs(res);
if (res<=eps) return ;
else return ;
}
bool work(int id){
build(id);
if (phi()) return ;
else return ;
}
int main(){
n=read();
for (int i=;i<=n;i++){
v1[i]=read(),v2[i]=read(),v3[i]=read();
}
for (int i=;i<=n;i++){
if (pd(i)&&work(i)) puts("Yes");
else puts("No");
}
return ;
}

POJ 1755 Triathlon的更多相关文章

  1. POJ 1755 Triathlon [半平面交 线性规划]

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6912   Accepted: 1790 Descrip ...

  2. POJ 1755 Triathlon (半平面交)

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4733   Accepted: 1166 Descrip ...

  3. POJ 1755 Triathlon(线性规划の半平面交)

    Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...

  4. POJ 1755 Triathlon 半平面交

    看的这里:http://blog.csdn.net/non_cease/article/details/7820361 题意:铁人三项比赛,给出n个人进行每一项的速度vi, ui, wi;  对每个人 ...

  5. poj 1755 半平面交+不等式

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6461   Accepted: 1643 Descrip ...

  6. POJ 1755

    列出不等式后,把同时除Z把它去掉. 注意了,这里应该 是把直线变两点表示的向量更为简单,我开始就直接用直线写,后来,唉,写不下去了.. #include <iostream> #inclu ...

  7. [转] POJ计算几何

    转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...

  8. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  9. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

随机推荐

  1. 自动删除n天前日志

    自动删除n天前日志 linux 是一个很能自动产生文件的系统,日志.邮件.备份等.虽然现在硬盘廉价,我们可以有很多硬盘空间供这些文件浪费,让系统定时清理一些不需要的文件很有一种 爽快的事情.不用你去每 ...

  2. 美国易安信公司 EMC

    EMC 提供了帮助您利用这一资产的工具.凭着我们的系统.软件.服务和解决方案,我们能够与您一道为您的公司打造一个综合性的信息基础架构.我们帮助客户设计.构建和管理智能.灵活而且安全的信息基础架构.这些 ...

  3. Java中快速排序的实现

    快速排序是对冒泡排序的一种改进.它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排 ...

  4. JS点击按钮弹出窗口

    由于没有系统学习过JS,遇到一个需求:点击按钮,弹出一个独立的窗口. 在网上百度了一下,并没有找到满意的结果,最重要的是各种方法很复杂.最终,仔细研究了一下,原来只是需要只要一个简单的函数就能满足自己 ...

  5. dialog中的button动态设置为disable[转]

    我们再写dialog的时候,会时常有这样一种需求,希望通过某些条件将dialog的button设置为disable的. 基本的命令就是将“确定”这个button设置为disable(false). 如 ...

  6. 获取布局 ActionBar

    LayoutInflater inflater = getLayoutInflater();View imageLayout = inflater.inflate(R.layout.preferenc ...

  7. javascript中的原型理解总结

    经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...

  8. 新手上路Tomcat 7.x和JDK的配置

    前言:这段时间又复习了JAVA以前做东西总是在IDE里面好多基础的东西都不知道,这次买了本书让自己重新认识下JAVA! 说明:以前装JDK时,我是和Mars老师学的那种开发JAVA应用程序进行配置的环 ...

  9. mongo 初始配置

    连接mongo 时  在window的可视化工具 有时会出现这种无法找到表的情况 那么我们所需要的是什么?? 用客户端的命令行 查看是否能够真正连接成功 下载mongo window 并安装  这个网 ...

  10. C#基础枚举的设计

    枚举分为:简单枚举和标记枚举(为了枚举值位操作) 标记枚举的用法: