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. HDOJ 1395 2^x mod n = 1

    Problem Description Give a number n, find the minimum x(x>0) that satisfies 2^x mod n = 1. Input ...

  2. bzoj1965 [Ahoi2005]SHUFFLE 洗牌

    Description 为了表彰小联为Samuel星球的探险所做出的贡献,小联被邀请参加Samuel星球近距离载人探险活动. 由于Samuel星球相当遥远,科学家们要在飞船中度过相当长的一段时间,小联 ...

  3. HDU_2011——求多项式的前n项和

    Problem Description 多项式的描述如下:1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + ...现在请你求出该多项式的前n项的和.   Input 输入数据由2行组 ...

  4. POJ(2784)Buy or Build

    Buy or Build Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1369   Accepted: 542 Descr ...

  5. CentOS下MySQL无法正常启动错误

    一.非正常关机/退出MySQL时报错:/var/lib/mysql/mysql.sock 1.重启机器:shutdown -h now 2.删除或重命名:rm -r /var/lib/mysql/my ...

  6. word-wrap: break-word 和 word-break: break-all 到底有啥区别?

    做项目改bug的时候,遇到过好多次,要么是文本超出文本区域,或者单词太长(一般是url链接中的一些鬼),把装它的标签强制撑大,导致一些响应式问题.除此之外,还有很多问题,每次都是恍然醒悟,然后又在网上 ...

  7. [置顶] Android的IPC访问控制设计与实现

    3.3.1 IPC钩子函数设计与实现 IPC Binder是Android最重要的进程间通信机制,因此,必须在此实施强制访问控制. 1. 修改secuirty.h 打开终端shell,输入指令“cd ...

  8. C语言 对数组名取地址

    作者 : 卿笃军 你有没有想过,对一个一维数组名取地址,然后用这个地址进行加减运算.这会出现什么样的结果呢? 演示样例: int a[5] = {1,2,3,4,5}; int *p = (int * ...

  9. SUN-LDAP6.3_RHEL 5.0-卸载LDAP

    卸载LDAP 1.注销服务器 到目录/ldap/ldapinstance/dscc6/bin下 # ./dsccreg remove-server -h 主机名 /ldap/ldapinstance/ ...

  10. 【转】在写一个iOS应用之前必须做的7件事(附相关资源)

    转自:http://www.cocoachina.com/ios/20160316/15687.html 本文由CocoaChina--不再犹豫(tao200610704@126.com)翻译 作者: ...