uvalive 4973 Ardenia

题意:给出空间两条线段,求距离。

注意输出格式!

  1 #include<cstdio>
  2 #include<cmath>
  3 #include<algorithm>
  4 using namespace std;
  5 
  6 struct Point3
  7 {
  8     int x, y, z;
  9     Point3(int x=0, int y=0, int z=0):x(x),y(y),z(z) { }
 10 };
 11 
 12 typedef Point3 Vector3;
 13 
 14 Vector3 operator + (const Vector3& A, const Vector3& B)
 15 {
 16     return Vector3(A.x+B.x, A.y+B.y, A.z+B.z);
 17 }
 18 Vector3 operator - (const Point3& A, const Point3& B)
 19 {
 20     return Vector3(A.x-B.x, A.y-B.y, A.z-B.z);
 21 }
 22 Vector3 operator * (const Vector3& A, int p)
 23 {
 24     return Vector3(A.x*p, A.y*p, A.z*p);
 25 }
 26 
 27 bool operator == (const Point3& a, const Point3& b)
 28 {
 29     return a.x==b.x && a.y==b.y && a.z==b.z;
 30 }
 31 
 32 Point3 read_point3()
 33 {
 34     Point3 p;
 35     scanf("%d%d%d", &p.x, &p.y, &p.z);
 36     return p;
 37 }
 38 
 39 int Dot(const Vector3& A, const Vector3& B)
 40 {
 41     return A.x*B.x + A.y*B.y + A.z*B.z;
 42 }
 43 int Length2(const Vector3& A)
 44 {
 45     return Dot(A, A);
 46 }
 47 Vector3 Cross(const Vector3& A, const Vector3& B)
 48 {
 49     return Vector3(A.y*B.z - A.z*B.y, A.z*B.x - A.x*B.z, A.x*B.y - A.y*B.x);
 50 }
 51 
 52 typedef long long LL;
 53 
 54 LL gcd(LL a, LL b)
 55 {
 56     return b ? gcd(b, a%b) : a;
 57 }
 58 LL lcm(LL a, LL b)
 59 {
 60     return a / gcd(a,b) * b;
 61 }
 62 
 63 struct Rat
 64 {
 65     LL a, b;
 66     Rat(LL a=0):a(a),b(1) { }
 67     Rat(LL x, LL y):a(x),b(y)
 68     {
 69         if(b < 0) a = -a, b = -b;
 70         LL d = gcd(a, b);
 71         if(d < 0) d = -d;
 72         a /= d;
 73         b /= d;
 74     }
 75 };
 76 
 77 Rat operator + (const Rat& A, const Rat& B)
 78 {
 79     LL x = lcm(A.b, B.b);
 80     return Rat(A.a*(x/A.b)+B.a*(x/B.b), x);
 81 }
 82 
 83 Rat operator - (const Rat& A, const Rat& B)
 84 {
 85     return A + Rat(-B.a, B.b);
 86 }
 87 Rat operator * (const Rat& A, const Rat& B)
 88 {
 89     return Rat(A.a*B.a, A.b*B.b);
 90 }
 91 
 92 void updatemin(Rat& A, const Rat& B)
 93 {
 94     if(A.a*B.b > B.a*A.b) A.a = B.a, A.b = B.b;
 95 }
 96 
 97 // 点P到线段AB的距离的平方
 98 Rat Rat_Distance2ToSegment(const Point3& P, const Point3& A, const Point3& B)
 99 {
100     if(A == B) return Length2(P-A);
101     Vector3 v1 = B - A, v2 = P - A, v3 = P - B;
102     if(Dot(v1, v2) < 0) return Length2(v2);
103     else if(Dot(v1, v3) > 0) return Length2(v3);
104     else return Rat(Length2(Cross(v1, v2)), Length2(v1));
105 }
106 
107 // 求异面直线p1+su和p2+tv的公垂线对应的s。如果平行/重合,返回false
108 bool Rat_LineDistance3D(const Point3& p1, const Vector3& u, const Point3& p2, const Vector3& v, Rat& s)
109 {
110     LL b = (LL)Dot(u,u)*Dot(v,v) - (LL)Dot(u,v)*Dot(u,v);
111     if(b == 0) return false;
112     LL a = (LL)Dot(u,v)*Dot(v,p1-p2) - (LL)Dot(v,v)*Dot(u,p1-p2);
113     s = Rat(a, b);
114     return true;
115 }
116 
117 void Rat_GetPointOnLine(const Point3& A, const Point3& B, const Rat& t, Rat& x, Rat& y, Rat& z)
118 {
119     x = Rat(A.x) + Rat(B.x-A.x) * t;
120     y = Rat(A.y) + Rat(B.y-A.y) * t;
121     z = Rat(A.z) + Rat(B.z-A.z) * t;
122 }
123 
124 Rat Rat_Distance2(const Rat& x1, const Rat& y1, const Rat& z1, const Rat& x2, const Rat& y2, const Rat& z2)
125 {
126     return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2);
127 }
128 
129 int main()
130 {
131     int T;
132     scanf("%d", &T);
133     LL maxx = 0;
134     while(T--)
135     {
136         Point3 A = read_point3();
137         Point3 B = read_point3();
138         Point3 C = read_point3();
139         Point3 D = read_point3();
140         Rat s, t;
141         bool ok = false;
142         Rat ans = Rat(1000000000);
143         if(Rat_LineDistance3D(A, B-A, C, D-C, s))
144             if(s.a > 0 && s.a < s.b && Rat_LineDistance3D(C, D-C, A, B-A, t))
145                 if(t.a > 0 && t.a < t.b)
146                 {
147                     ok = true; // 异面直线/相交直线
148                     Rat x1, y1, z1, x2, y2, z2;
149                     Rat_GetPointOnLine(A, B, s, x1, y1, z1);
150                     Rat_GetPointOnLine(C, D, t, x2, y2, z2);
151                     ans = Rat_Distance2(x1, y1, z1, x2, y2, z2);
152                 }
153         if(!ok)   // 平行直线/重合直线
154         {
155             updatemin(ans, Rat_Distance2ToSegment(A, C, D));
156             updatemin(ans, Rat_Distance2ToSegment(B, C, D));
157             updatemin(ans, Rat_Distance2ToSegment(C, A, B));
158             updatemin(ans, Rat_Distance2ToSegment(D, A, B));
159         }
160         printf("%lld %lld\n", ans.a, ans.b);
161     }
162     return 0;
163 }
View Code

 

转载于:https://www.cnblogs.com/ITUPC/p/4903196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rz和sz上传下载文件

安装软件包 yum install lrzsz 上传文件&#xff0c;输入rz选择文件上传(可以按住shift键多选) # rz sz 下载文件到本地&#xff0c;选择保存文件夹 # sz dd xshell设置默认上传下载文件夹 转载于:https://www.cnblogs.com/fcing/p/9382377.html

怎样在html中设置首字母大写,javascript如何设置字符串首字母大写?

给出一个字符串&#xff0c;如何确保字符串的首字母都大写&#xff1f;下面本篇文章就来给大家介绍一下使用javascript设置首字母大写的方法&#xff0c;希望对大家有所帮助。在javascript中&#xff0c;可以使用slice()方法、toUpperCase()方法和toLowerCase()方法来设置首字母…

win2008修改远程端口

2019独角兽企业重金招聘Python工程师标准>>> 网络上找到的一段代码&#xff0c;保存为.bat&#xff0c;运行修改成功&#xff0c;需要重启。 echo off color 0a echo ◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇◇ echo ◇◇◇◇修改远程桌面3389端口批处理◇◇◇◇ ech…

html帮助文档乱码,使用doxygen生成的帮助文档,中文出现乱码的问题

今天使用doxygen工具生成帮助文档发现中文注释都是乱码。然后根据网上的要求把Exper>>Input>>INPUT_ENCODING&#xff1a;(输入文件的编码) UTF-8 改成 GBK 或者 GB2312Exper>>HTML>>CHM_INDEX_ENCODING&#xff1a;(输出文件的编码) UTF-8 改成 GBK 或…

Java并发编程--理解ThreadLocal

另一篇博文&#xff1a;Hibernet中的ThreadLocal使用 http://www.cnblogs.com/gnivor/p/4440776.html 本文参考&#xff1a;http://blog.csdn.net/lufeng20/article/details/24314381http://www.cnblogs.com/chenying99/articles/3405161.html ThreadLocal类接口很简单&#xf…

python之路——迭代器与生成器

要了解for循环是怎么回事儿&#xff0c;咱们还是要从代码的角度出发。 首先&#xff0c;我们对一个列表进行for循环。 for i in [1,2,3,4]: print(i) 上面这段代码肯定是没有问题的&#xff0c;但是我们换一种情况&#xff0c;来循环一个数字1234试试 for i in 1234print(i) 结…

DFS分布式文件系统--管理篇

DFS分布式文件系统--管理篇参考文档&#xff1a;浅谈DFS分布式文件系统DFS 命名空间 和 DFS 复制概述续DFS分布式文件系统--基础篇DFS分布式文件系统--部署篇添加命名空间服务器&#xff08;添加第二台命名空间服务器 NameSrv02)成功后如下图&#xff1a;“从显示区域隐藏命名空…

LVS负载均衡(3)——LVS工作模式与工作原理

LVS介绍及工作原理1. LVS 介绍LVS,Linux Virtual Server 的简写&#xff0c;意即 Linux 虚拟服务器&#xff0c;是一个虚拟的服务器集群系统&#xff0c;可以在 UNIX/Linux 平台下实现负载均衡集群功能。文章&#xff1a;LVS项目介绍LVS集群体系结构LVS集群的IP负载均衡技术LVS…

MyBatis入门(二)---一对一,一对多

一、创建数据库表 1.1、创建数据表同时插入数据 /* SQLyog Enterprise v12.09 (64 bit) MySQL - 5.6.27-log : Database - mybatis ********************************************************************* *//*!40101 SET NAMES utf8 */;/*!40101 SET SQL_MODE*/;/*!40014 SE…

零基础学Java的10个方法

2019独角兽企业重金招聘Python工程师标准>>> 版权声明&#xff1a;本文为北京尚学堂原创文章&#xff0c;未经允许不得转载。​ 零基础学Java只要方法得当&#xff0c;依然有机会学习好Java编程。 但作为初学者可以通过制定一些合理清晰的学习计划。 在帮你屡清楚思…

scp windows 和 linux 远程复制 (双向)

一下命令在cmd中 从w -> l : scp D:\a.txt root192.168.2.113:/home/a 从l -> w: scp root192.168.2.113:/home/aaa d:/b.txt 按说在Linux中也可以&#xff0c;但是不知道怎么的只有在winodws上行&#xff0c;在linux上就会报 ssh: connect to host 192.168.2.157 port 2…

北京尚学堂|程序员的智慧

2019独角兽企业重金招聘Python工程师标准>>> 版权声明&#xff1a;本文为北京尚学堂原创文章&#xff0c;未经允许不得转载。 编程是一种创造性的工作&#xff0c;是一门艺术。精通任何一门艺术&#xff0c;都需要很多的练习和领悟&#xff0c;所以这里提出的“智慧…

翼城中学2021高考成绩查询入口,2021年临汾中考分数线查询(4)

临汾2021年中考分数线查询 2021临汾中考录取分数线 19年临汾中考各校录取分数线 临汾各高中录取分数线 临汾2021中考录取线查询 中考信息网提供2021临汾中考分数线查询信息。临汾中考录取分数线预计7月初公布&#xff0c;届时考生可登陆临汾招生考试网官网查看分数线情况。2…

配置Tomcat使用HTTP/2

转自&#xff1a; https://zhuanlan.zhihu.com/p/21349186 前情提要&#xff1a; Tomcat高效响应的秘密(一) Sendfile与Gzip Tomcat高效响应的秘密(二) keep alive 前面高效响应的两篇&#xff0c;我们分析了Sendfile的特性以及HTTP1.1的keep-alive特性&#xff0c;基于这些功…

通过NSNotification来监听键盘弹出和弹回

在通知中心建立一个广播来监听键盘的弹出和弹回&#xff0c;在监听事件中加入触发事件的一些操作。 [[NSNotificationCenter defaultCenter]addObserver:self selector:selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];[[NSNotificatio…

IT综合学习网站收集

最近整理了一下曾经使用过的IT从入门到广泛的综合类基础学习网站&#xff0c;记录下来&#xff0c;以便初学者使用&#xff1a; 1.http://www.w3school.com.cn/ 中文版基础在线学习平台 2.http://www.runoob.com/ 中文版基础在线学习平台&#xff08;和W3类似&#xff09; 3.h…

mac安装gdb及为gdb进行代码签名

1. 安装gdb GDB作为一个强大的c/c调试工具&#xff0c;一直是程序猿们的良好伴侣&#xff0c;但转到Mac os才发现竟然没有默认安装&#xff0c;所幸还有强大的homebrew工具&#xff1a; brew install homebrew/dupes/gdb然后就是漫长的等待编译安装时间了&#xff0c;安装完成后…

Python学习---Django的基础操作180116

Django创建数据库操作 django流程之model实例 settigs.py&#xff1a;更改Django2.0.1的配置&#xff0c;更新为之前的路径配置 DIRS: [os.path.join(BASE_DIR, templates)], # 设置templates的路径为Django以前版本 # DIRS: [], # 注释掉该行&#xff0c;此为Django 2.0…

订阅Jenkins的邮件列表,获取最新的信息

进入https://jenkins.io/content/mailing-lists/ 点击感兴趣的话题 选择【archive】跳转到谷歌讨论组 最后&#xff0c;点击左上角的【Subscribe】即可加入Google Groups 备注&#xff1a;其实谷歌讨论组是一个很好用的东西&#xff0c;每个人都可以上去建&#xff0c;对于集成…

英语四六级和计算机二级是一,大学里最难考证书排名,四六级和计算机根本排不进前三...

大学是我们提高自身技能最好的一个时期&#xff0c;除了平时的课程和一些社团活动之外&#xff0c;还有一件最最必不可少的事情&#xff0c;那就是考证&#xff0c;而这也是为我们以后工作打好基础&#xff0c;为自己多准备一些敲门砖。我国各个行业都有属于自己的证书&#xf…