空间的200个点,求出至少四边相等,且其余两边必须不相邻的四面体的个数。

用map记录距离点i为d的点有几个,这样来优化暴力的四重循环。

别人的做法是枚举两点的中垂面上的点,再把到中点距离相等的点找出来,n^3的样子。

还要注意四个点共面的情况。

共面判断就是用叉乘计算出ijk三点所在面的法向量,然后判断il向量是否和法向量垂直,是则共面。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <map>
  6. #define eps (1e-6)
  7. #define N 205
  8. #define dd double
  9. #define sqr(x) ((x)*(x))
  10. using namespace std;
  11. map<double,int>mm[N];
  12. int ok[N];
  13. struct node{
  14. int x,y,z;
  15. }a[N];
  16. dd Dis[N][N];
  17. dd dis(int i,int j)
  18. {
  19. if(Dis[i][j])return Dis[i][j];
  20. return Dis[i][j]=sqrt(sqr(a[i].x-a[j].x)+sqr(a[i].y-a[j].y)+sqr(a[i].z-a[j].z));
  21. }
  22. node xmul(node i,node j,node k){
  23. int z=(i.x-j.x)*(k.y-j.y)-(i.y-j.y)*(k.x-j.x);
  24. int y=(i.z-j.z)*(k.x-j.x)-(i.x-j.x)*(k.z-j.z);
  25. int x=(i.y-j.y)*(k.z-j.z)-(i.z-j.z)*(k.y-j.y);
  26. return (node){x,y,z};
  27. }
  28. node xmul(int i,int j,int k){
  29. return xmul(a[i],a[j],a[k]);
  30. }
  31. int sgn(dd a,dd b){
  32. return fabs(a-b)>-eps&&fabs(a-b)<eps;
  33. }
  34. int te(int i,int j,int k,int l){//共面
  35. node il=(node){a[i].x-a[l].x,a[i].y-a[l].y,a[i].z-a[l].z};
  36. node s=xmul(i,j,k);
  37. return s.x*il.x+s.y*il.y+s.z*il.z;
  38. }
  39. int main() {
  40. int t,n;
  41. scanf("%d",&t);
  42. for(int cas=;cas<=t;cas++){
  43. scanf("%d",&n);
  44. for(int i=;i<=n;i++)
  45. scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
  46. int ans=,same=;
  47. memset(ok,,sizeof ok);
  48. memset(Dis,,sizeof Dis);
  49. for(int i=;i<=n;i++)
  50. for(int j=;j<=n;j++)mm[i].clear();
  51. for(int i=;i<=n;i++)
  52. for(int j=;j<=n;j++){
  53. mm[i][dis(i,j)]++;
  54. if(mm[i][dis(i,j)]>){ok[i]=;break;}
  55. }
  56. for(int i=;i<=n;i++)if(ok[i])
  57. for(int j=i+;j<=n;j++)if(ok[j])
  58. for(int k=i+;k<=n;k++)if(ok[k]){
  59. dd ij=dis(i,j),ik=dis(i,k),jk=dis(j,k);
  60. if(sgn(jk,ik))
  61. for(int l=k+;l<=n;l++)if(l!=j){
  62. dd jl=dis(j,l),lk=dis(l,k),il=dis(i,l);
  63. if(te(i,j,k,l)){
  64. if(sgn(jk,jl)&&sgn(jl,il)&&sgn(il,jl))
  65. {
  66. ans++;
  67. if(sgn(ij,lk)&&sgn(ij,ik))same++;
  68. }
  69. }
  70. }
  71. }
  72. printf("Case #%d: %d\n",cas,ans-same/*);//全部边相同的会计算3次
  73. }
  74. }

赛后做出来的,为什么当时暴力都写不出来呢,因为在防止多算的时候给漏算了。枚举出错。

【HDU 5839】Special Tetrahedron(计算几何)的更多相关文章

  1. HDU 5839 Special Tetrahedron 计算几何

    Special Tetrahedron 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  2. HDU 5839 Special Tetrahedron

    HDU 5839 Special Tetrahedron 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n ...

  3. HDU 5839 Special Tetrahedron (计算几何)

    Special Tetrahedron 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5839 Description Given n points ...

  4. HDU 5839 Special Tetrahedron (2016CCPC网络赛08) (暴力+剪枝)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5839 在一个三维坐标,给你n个点,问你有多少个四面体(4个点,6条边) 且满足至少四边相等 其余两边不 ...

  5. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  6. (四面体)CCPC网络赛 HDU5839 Special Tetrahedron

    CCPC网络赛 HDU5839 Special Tetrahedron 题意:n个点,选四个出来组成四面体,要符合四面体至少四条边相等,若四条边相等则剩下两条边不相邻,求个数 思路:枚举四面体上一条线 ...

  7. hdu 5839(三维几何)

    Special Tetrahedron Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  8. HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

    Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  9. HDU 4569 Special equations(取模)

    Special equations Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. android 下载文件

    import com.example.android.R; import android.app.Activity;import android.os.Bundle;import android.os ...

  2. HTTP 错误 500.22 - Internal Server Error

    HTTP 错误 500.22 - Internal Server Error 检测到在集成的托管管道模式下不适用的 ASP.NET 设置. 最可能的原因: 此应用程序在 system.web/http ...

  3. h1/title,b/strong,i/em 的区别

    < strong > 表示html页面上的强调(emphasized text), < em > 表示句子中的强调(即强调语义) 1.b和strong的区别 盲人朋友使用阅读设 ...

  4. 在linux下运行java工程

    在linux 服务器上运行JAVA工程需注意.1: 在linux 上: /etc/profile  设置classpath 配置正确的jar 路径.2:  把本地JAVA工程做成一个jar包.如:1. ...

  5. NOI2018准备Day19

    5天没写. 伸展树  主席树 3到线段树模板题

  6. Collections和Arrays常用方法

    Collections:常见方法: 1, 对list进行二分查找: 前提该集合一定要有序. int binarySearch(list,key); //必须根据元素自然顺序对列表进行升级排序 //要求 ...

  7. python中from module import * 的一个陷阱

    from module import *把module中的成员全部导到了当前的global namespace,访问起来就比较方便了.当然,python style一般不建议这么做,因为可能引起nam ...

  8. byte[] 转字符串 中文乱码

    闲来无事,写了一个UWP的UDP/TCP小Demo,网上找了个网络调试助手,就兴冲冲的开始玩耍 结果“鸡同鸭讲”: 讲英文的时候大家都是abc,hello man!how are you? 讲中文的时 ...

  9. flex弹性布局学习笔记

    前言 资料来源于网络,本人只是对此作了一下操作,记录于此以便以后查阅.目的在于梳理自己前端凌乱的知识点. 本文根据 Brian Franco 的一个flexbox.scss库来记录 入职新公司前对移动 ...

  10. Windows7 x64配置 Apache2 + PHP5 + MySQL5

    1:相关软件下载: Apache HTTP Server             版本:(httpd-2.2.25-win32-x86-openssl-0.9.8y) PHP             ...