Gym 100531H Problem H. Hiking in the Hills 二分
Problem H. Hiking in the Hills
题目连接:
http://codeforces.com/gym/100531/attachments
Description
Helen is hiking with her friends in a highland. Their plan is to hike from their camp A to a beautiful
showplace B.
Unfortunately, Helen started feeling dizzy due to altitude sickness. Help her group find a route such that
the topmost height on that route is as small as possible.
Input
The input file contains full information about the landscape of a square region 106 × 106
in the following
format. The first line contains integer n — the number of triangles in the landscape (2 ≤ n ≤ 2000).
Each of following n lines contains nine integers xi1, yi1, zi1, xi2, yi2, zi2, xi3, yi3, zi3 — coordinates of a
triangle. All coordinates belong to the closed interval [0, 106
]. The two last lines contain three integers
each: xA, yA, zA and xB, yB, zB — coordinates of the camp A and the showplace B.
The given triangles are guaranteed to describe a consistent continuous landscape. Projections of triangles
onto XY plane are non-degenerate and fill the square without overlapping. A vertex of one triangle never
lays inside an edge of another triangle. Points A and B belong to the landscape surface and are different.
Output
Output a polyline route from A to B with the smallest possible topmost height. The first line should
contain m, the number of vertices in this polyline. Each of following m lines should contain three integer
coordinates of a polyline vertex: xi
, yi
, and zi
. Vertices must be listed along the polyline, from A to B
(including these two endpoints).
All coordinates of polyline vertices should be integer. Each polyline edge must belong to some triangle
from the input file (possibly, to its edge). The number of vertices in the polyline must not exceed 5n.
Sample Input
8
1000000 0 0 1000000 1000000 150000 600000 600000 400000
0 1000000 0 600000 600000 400000 600000 1000000 300000
0 1000000 0 400000 300000 150000 600000 600000 400000
400000 0 200000 1000000 0 0 400000 300000 150000
400000 300000 150000 1000000 0 0 600000 600000 400000
600000 600000 400000 1000000 1000000 150000 600000 1000000 300000
0 0 0 400000 0 200000 400000 300000 150000
0 1000000 0 0 0 0 400000 300000 150000
100000 700000 37500
900000 400000 137500
Sample Output
4
100000 700000 37500
400000 300000 150000
900000 150000 100000
900000 400000 137500
Hint
题意
给你一个多面体,每个平面都是一个三角形
然后给你一个A点和B点,你需要输出一个从A到B的路径,使得这条路径的最高点最低
题解:
首先,走点一定是可行的,所以我们就可以不用去考虑边。
在一个三角形内的话,就连一条边。
然后我们直接二分高度,然后每次CHECK A是否能到B 就好了
注意精度有毒。。。
代码
#include<bits/stdc++.h>
using namespace std;
struct node
{
double x,y,z;
bool operator<(const node& p) const
{
if(z==p.z&&y==p.y)return x<p.x;
if(z==p.z)return y<p.y;
return z<p.z;
}
};
struct Tri
{
node p[3];
};
Tri tri[5006];
map<node,int> H;
map<int,node> T;
int tot = 1;
node A,B;
vector<int> E[7000];
int vis[7000];
int n;
void init()
{
memset(vis,0,sizeof(vis));
H.clear();
T.clear();
tot = 1;
for(int i=0;i<7000;i++)
E[i].clear();
memset(tri,0,sizeof(tri));
}
double eps = 1e-2;
double dis(node aa,node bb)
{
return sqrt((aa.x-bb.x)*(aa.x-bb.x)+(aa.y-bb.y)*(aa.y-bb.y)+(aa.z-bb.z)*(aa.z-bb.z));
}
double area(node aa,node bb,node cc)
{
double l1 = dis(aa,bb);
double l2 = dis(aa,cc);
double l3 = dis(bb,cc);
double pp = (l1+l2+l3)/2.0;
return sqrt(pp*(pp-l1)*(pp-l2)*(pp-l3));
}
int inRan(Tri kkk,node ttt)
{
double a1 = area(kkk.p[0],kkk.p[1],ttt);
double a2 = area(kkk.p[0],kkk.p[2],ttt);
double a3 = area(kkk.p[1],kkk.p[2],ttt);
double a4 = area(kkk.p[0],kkk.p[1],kkk.p[2]);
if(fabs(a4-a1-a2-a3)<=eps)return 1;
return 0;
}
void dfs(int x,int h)
{
vis[x]=1;
for(int i=0;i<E[x].size();i++)
{
int v = E[x][i];
if(vis[v])continue;
if(T[v].z>h)continue;
dfs(v,h);
}
}
int check(double h)
{
if(A.z>h||B.z>h)return 0;
memset(vis,0,sizeof(vis));
dfs(H[A],h);
if(vis[H[B]]==1)return 1;
return 0;
}
vector<node> TTT;
int flag = 0;
void dfs2(int x,double h)
{
if(flag)return;
TTT.push_back(T[x]);
if(x==H[B])
{
flag = 1;
cout<<TTT.size()<<endl;
for(int i=0;i<TTT.size();i++)
printf("%.0f %.0f %.0f\n",TTT[i].x,TTT[i].y,TTT[i].z);
return;
}
vis[x]=1;
for(int i=0;i<E[x].size();i++)
{
int v = E[x][i];
if(vis[v])continue;
if(T[v].z>h)continue;
dfs2(v,h);
TTT.pop_back();
}
}
int main()
{
freopen("hiking.in","r",stdin);
freopen("hiking.out","w",stdout);
init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=0;j<3;j++)
{
scanf("%lf%lf%lf",&tri[i].p[j].x,&tri[i].p[j].y,&tri[i].p[j].z);
if(H[tri[i].p[j]]==0)
{
T[tot] = tri[i].p[j];
H[tri[i].p[j]] = tot++;
}
}
for(int j=0;j<3;j++)
{
for(int k=j+1;k<3;k++)
{
E[H[tri[i].p[j]]].push_back(H[tri[i].p[k]]);
E[H[tri[i].p[k]]].push_back(H[tri[i].p[j]]);
}
}
}
scanf("%lf%lf%lf",&A.x,&A.y,&A.z);
scanf("%lf%lf%lf",&B.x,&B.y,&B.z);
if(H[A]==0)
{
T[tot] = A;
H[A] = tot++;
for(int i=1;i<=n;i++)
{
if(inRan(tri[i],A))
{
for(int j=0;j<3;j++)
{
E[H[A]].push_back(H[tri[i].p[j]]);
E[H[tri[i].p[j]]].push_back(H[A]);
}
}
}
}
if(H[B]==0)
{
T[tot] = B;
H[B] = tot++;
for(int i=1;i<=n;i++)
{
if(inRan(tri[i],B))
{
for(int j=0;j<3;j++)
{
E[H[B]].push_back(H[tri[i].p[j]]);
E[H[tri[i].p[j]]].push_back(H[B]);
}
}
}
}
double l = -2.0,r = 3000050.0;
for(int i=1;i<=100;i++)
{
double mid = (l+r)/2.0;
if(check(mid))r=mid;
else l=mid;
}
memset(vis,0,sizeof(vis));
TTT.clear();
dfs2(H[A],r+1);
}
Gym 100531H Problem H. Hiking in the Hills 二分的更多相关文章
- Codeforces Gym 100610 Problem H. Horrible Truth 瞎搞
Problem H. Horrible Truth Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/1006 ...
- Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉
Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...
- codeforce gym/100495/problem/K—Wolf and sheep 两圆求相交面积 与 gym/100495/problem/E—Simple sequence思路简述
之前几乎没写过什么这种几何的计算题.在众多大佬的博客下终于记起来了当时的公式.嘚赶快补计算几何和概率论的坑了... 这题的要求,在对两圆相交的板子略做修改后,很容易实现.这里直接给出代码.重点的部分有 ...
- 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem H. Password Service dp
Problem H. Password Service 题目连接: http://www.codeforces.com/gym/100253 Description Startups are here ...
- 2010-2011 ACM-ICPC, NEERC, Moscow Subregional Contest Problem H. Hometask 水题
Problem H. Hometask 题目连接: http://codeforces.com/gym/100714 Description Kolya is still trying to pass ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- The Ninth Hunan Collegiate Programming Contest (2013) Problem H
Problem H High bridge, low bridge Q: There are one high bridge and one low bridge across the river. ...
- 清北学堂入学测试P4751 H’s problem(h)
P4751 H’s problem(h) 时间: 1000ms / 空间: 655360KiB / Java类名: Main 背景 冬令营入学测试 描述 小H是一个喜欢逛街的女孩子,但是由于上了大学 ...
- Problem H
Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个 ...
随机推荐
- Python自动单元测试框架
原文链接:http://www.ibm.com/developerworks/cn/linux/l-pyunit/ 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写 ...
- 【转】linux下cpio命令使用
转自:http://www.51testing.com/html/32/498132-816949.html 功能说明:备份文件. 补充说明:cpio是用来建立,还原备份档的工具程序,它可以加入,解开 ...
- [转]Linux之od命令
转自:http://os.51cto.com/art/200912/173136.htm 随着计算机飞速的发展,很多人开始学习Linux,怎样才能学好Linux,一定要学好Linux的命令.学习Lin ...
- 用Asp.net实现简单的文字水印
用Asp.net实现简单的文字水印 经常看见MOP上有人贴那种动态的图片,就是把一个字符串作为参数传给一个动态网页,就会生成一个带有这个字符串的图片,这个叫做文字水印.像什么原来的熊猫系列,还有后来 ...
- Scrum概述
• 敏捷方法是一类软件开发流程的泛称: • 敏捷方法是相对于传统的瀑布式软件过程提出的: • 敏捷方法可以用敏捷宣言(4条).敏捷原则(12条)来概括: • 敏捷原则通过一系列的敏捷实践来体现出来: ...
- Java之对象池
单例模式是限制了一个类只能有一个实例,对象池模式则是限制一个类实例的个数.对象池类就像是一个对象管理员,它以Static列表(也就是装对象的池子)的形式存存储某个实例数受限的类的实例,每一个实例还要加 ...
- SQL获取变量类型以及变量最大长度
DECLARE @Temp nvarchar(1050)='' SELECT CAST(SQL_VARIANT_PROPERTY(@Temp, 'BaseType') AS VARCHAR(50))S ...
- MSSQL 2005数据库可疑状态
今天早上打开进销存,提示链接失败,经过检查参数,网络.端口等各种情况,均没有发现问题,最后检查数据库本事的问题. 通过studio进去发现我的进销存数据变成了(可疑)状态,随机百度修复方法,修复方法还 ...
- Chocolatey的安装与使用
@(编程) 前言 在 Linux 下,大家喜欢用 apt-get 来安装应用程序,如今在 windows 下,大家可以使用 Chocolatey 来快速下载搭建一个开发环境. Chocolatey 的 ...
- 自然对数e
上学时课本里提到过,有一种以无理数e=2.71828--为底数的对数,称为自然对数.当时老师并没有讲明白这是个啥东西.并且还有一个很奇怪的极限,也是靠记忆的,完全不理解. \[\lim_{n\to\i ...