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 ...
随机推荐
- Linux系统编程(37)—— socket编程之UDP服务器与客户端
典型的UDP客户端/服务器通讯过程: 编写UDP Client程序的步骤 1.初始化sockaddr_in结构的变量,并赋值.这里使用"8888"作为连接的服务程序的端口,从命令行 ...
- 在什么情况下使用struct,struct与class的区别
Struct定义和使用 类是引用类型,是保存在托管堆中的.通过定义类,我们可以在数据的生存期上得到很高的灵活性,但是也会让程序的性能有一定的损失.虽然这种损失很小,但当我们只需要定义一个很小的结构时, ...
- SPOJ--K-query (线段树离线) 离线操作解决一些问题
K-query Given a sequence of n numbers a1, a2, ..., an and a number of k- queries. A k-query is a tri ...
- Bonobos | IT桔子
Trumaker | IT桔子 Trumaker trumaker.com
- Java 反射机制详解
动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...
- 创建多模块maven项目
有两种方式: 1,new -->maven project-->maven-archetype-quickstart 建完多个独立的project后,手动修改pom文件的packing类型 ...
- Spark-用户应用程序入门
/* 2 Spark Standalone模式下的Application Application是Spark中类似于Hadoop的Job的用户提交的应用.sc是Spark集群初始化时创建的SparkC ...
- 最最常用的 100 个 Java 类(转)
大部分的 Java 软件开发都会使用到各种不同的库.近日我们从一万个开源的 Java 项目中进行分析,从中提取出最常用的 Java 类,这些类有来自于 Java 的标准库,也有第三方库.每个类在同一个 ...
- Java虚拟机之垃圾回收详解一
Java虚拟机之垃圾回收详解一 Java技术和JVM(Java虚拟机) 一.Java技术概述: Java是一门编程语言,是一种计算平台,是SUN公司于1995年首次发布.它是Java程序的技术基础,这 ...
- Java学习之List接口
List接口 List接口的定义如下: public interface List<E>extends Collection<E> 可以发现List接口时Collection接 ...