POJ 1755 Triathlon
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的更多相关文章
- POJ 1755 Triathlon [半平面交 线性规划]
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6912 Accepted: 1790 Descrip ...
- POJ 1755 Triathlon (半平面交)
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4733 Accepted: 1166 Descrip ...
- POJ 1755 Triathlon(线性规划の半平面交)
Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...
- POJ 1755 Triathlon 半平面交
看的这里:http://blog.csdn.net/non_cease/article/details/7820361 题意:铁人三项比赛,给出n个人进行每一项的速度vi, ui, wi; 对每个人 ...
- poj 1755 半平面交+不等式
Triathlon Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6461 Accepted: 1643 Descrip ...
- POJ 1755
列出不等式后,把同时除Z把它去掉. 注意了,这里应该 是把直线变两点表示的向量更为简单,我开始就直接用直线写,后来,唉,写不下去了.. #include <iostream> #inclu ...
- [转] POJ计算几何
转自:http://blog.csdn.net/tyger/article/details/4480029 计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很巧妙2.做计算几何题目,模板 ...
- ACM计算几何题目推荐
//第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...
- KUANGBIN带你飞
KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题 //201 ...
随机推荐
- DELPHI7如何调用带参数的JAVA WebService
对方提供的WebService地址是http://192.168.1.6:8080/test/pic?XH=XX用DELPHI如何调呢 ------解决方案--------------------通过 ...
- java中post和get请求
示例代码: package com.shareboxes.util; import java.io.BufferedReader; import java.io.IOException; import ...
- 根据请求头跳转判断Android&iOS
if(navigator.userAgent.match(/Android/i)) { window.location = 'http://apk.hiapk.com/m/downloads?id=c ...
- Linux输出重定向
- hadoop部署工具与配置工具
https://github.com/xianglei/phpHiveAdmin 随着Hadoop的推出,大数据处理实现了技术上的落地.但是对于一般的公司和开发者而言,Hadoop依旧是一个陌生或者难 ...
- C# Tips:获得当前登录计算机的用户(本地用户/域用户)
须要using的namespace: using System.Security.Principal; 获得登录计算机的用户: WindowsIdentity windowsIdentity = Wi ...
- 为什么HikariCP被号称为性能最好的Java数据库连接池,怎样配置使用
HiKariCP是数据库连接池的一个后起之秀.号称性能最好.能够完美地PK掉其它连接池. 原文地址:http://blog.csdn.net/clementad/article/details/469 ...
- jdk\willy\集群安装
一.telnet用户验证端口: yum install telnet #也可以使用 yum install telnet-ssl 安装支持SSL的telnet方式,这样安全一些,不建议使用标准的tel ...
- iOS避免键盘遮挡输入方案
项目中经常会遇到这样的问题:一个tableView中有大量的textField,当点击屏幕底部的textfield时,由于键盘弹出挡住了textfield输入框里的内容,造成很差的用户体验,如下图,点 ...
- cordova热更新
cordova 热更新: 一.添加插件 1.新建Cordova项目 cordova create CordovaHotCode com.ezample.hotcode 2.添加Android平台 在新 ...