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企业级项目实践之网络爬虫(27)——多路IO复用
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程. 主要应用: (1)客户程序需要同时处理交互式的输入和服务器之间的网络连接 (2) ...
- HTTP数据包头解析---之温故而知新!
[转]HTTP请求模型和头信息参考 参考: http://blog.csdn.net/baggio785/archive/2006/04/13/661410.aspx模型: http://blog.c ...
- Android入门学习:Android 系统框架及应用程序执行过程
Android基础知识学习 新手上路,还请多多帮助.由于初学,博客内容难免有不正确的地方,还请各位多多指教,相互学习! 主要内容: 1.Android层次架构及主要功能 2.Android编程模型,程 ...
- hdu 2583 permutation 动态规划
Problem Description Permutation plays a very important role in Combinatorics. For example ,1 2 3 4 ...
- 基于 canvas 将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢? HTML5 让这个可能变成了现实,通过 canvas,可以很轻松实现这个功能. 其实原理很简单:扫描图片相应位置的像素点,再计算出其灰 ...
- (转)awk命令
转自:http://man.lupaworld.com/content/manage/ringkee/awk.htm#id2874788 整理:Jims of 肥肥世家 <jims.yang@g ...
- Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子)
Js中执行变量中的命令语句,也就是所谓的宏替换(很实用的例子) 由其做动态编程时非常有用,必须符合js中的语法,用eval能够执行. var aaa="alert('这是变量中的语句')&q ...
- Rational AppScan 扫描大型网站
Rational AppScan 工作原理 Rational AppScan(简称 AppScan)其实是一个产品家族,包括众多的应用安全扫描产品,从开发阶段的源代码扫描的 AppScan sourc ...
- jQuery之简单动画效果
1. show()显示动画 语法:show(speed,callback) Number/String,Function speend为动画执行时间,单位为毫秒.也可以为slow",&quo ...
- Java static块
首先,我们看一个实际例子: class Test{ public static int X=100; public final static int Y=200; public Test(){ Sys ...