传送门

三维凸包模板题……只是听了听计算几何的课之后心血来潮想写的……

我的做法很无脑是吧……暴力枚举三个点组成的三角形,然后枚举剩下的点,判断其余点是否都在这个三角形的同一侧,是的话则说明这个三角形是凸包的一个面。

理论复杂度应该是$O(n^4)$,不过看上去跑得飞快?人帅自带小常数哈哈

这个故事告诉我们:大力出奇迹……

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<algorithm>
  5. #include<iostream>
  6. #include<fstream>
  7. #include<iomanip>
  8. using namespace std;
  9. const int maxn=;
  10. const long double eps=1e-;
  11. struct Point{
  12. long double x,y,z;
  13. Point(long double x=0.0,long double y=0.0,long double z=0.0):x(x),y(y),z(z){}
  14. Point operator-(const Point &a)const{return Point(a.x-x,a.y-y,a.z-z);}//A - B = B到A的位移
  15. Point operator/(const long double &a)const{return Point(x/a,y/a,z/a);}
  16. }a[maxn];
  17. typedef Point Vector;
  18. long double noise();
  19. long double Dot(const Vector&,const Vector&);
  20. Vector Cross(const Vector&,const Vector&);
  21. long double Length(const Vector&);
  22. long double Area2(const Point&,const Point&,const Point&);
  23. Vector LawVector(const Vector&,const Vector&);
  24. long double Distance(const Point&,const Point&,const Vector&);
  25. ifstream fin("enwrap.in");
  26. ofstream fout("enwrap.out");
  27. long double ans=0.0;
  28. int n,t;
  29. int main(){
  30. fin>>n;
  31. for(int i=;i<=n;i++){
  32. fin>>a[i].x>>a[i].y>>a[i].z;
  33. a[i].x+=noise();
  34. a[i].y+=noise();
  35. a[i].z+=noise();
  36. }
  37. Vector A;
  38. long double d;
  39. bool bad;
  40. for(int i=;i<=n;i++)for(int j=;j<i;j++)for(int k=;k<j;k++){
  41. bad=false;
  42. t=;
  43. A=LawVector(a[j]-a[i],a[k]-a[i]);
  44. for(int l=;l<=n;l++)if(i!=l&&j!=l&&k!=l){
  45. d=Distance(a[l],a[i],A);
  46. if(!t)t=(d<?-:);
  47. else if(t*d<){
  48. bad=true;
  49. break;
  50. }
  51. }
  52. if(!bad)ans+=Area2(a[i],a[j],a[k]);
  53. }
  54. ans/=2.0;
  55. fout<<fixed<<ans;
  56. return ;
  57. }
  58. long double noise(){
  59. static int a=,b=,p=,x=;
  60. x=a*x+b;x%=p;
  61. if(x<)x+=p;
  62. return (long double)(x-p)/p*5e-;
  63. }
  64. inline long double Dot(const Vector &A,const Vector &B){return A.x*B.x+A.y*B.y+A.z*B.z;}
  65. inline Vector Cross(const Vector &A,const Vector &B){return Vector(A.y*B.z-B.y*A.z,A.z*B.x-B.z*A.x,A.x*B.y-B.x*A.y);}
  66. inline long double Length(const Vector &A){return sqrt(Dot(A,A));}
  67. inline long double Area2(const Point &A,const Point &B,const Point &C){return Length(Cross(B-A,C-A));}
  68. inline Vector LawVector(const Vector &A,const Vector &B){
  69. Vector n=Cross(A,B);
  70. return n/Length(n);
  71. }//两个向量的叉积一定同时垂直于这两个向量
  72. inline long double Distance(const Point &A,const Point &P,const Vector &n){return Dot(A-P,n);}//(P,n)是平面的点法式,n是单位向量
  73. /*
  74. 三维凸包——暴力法
  75. 暴力枚举三个点组成的三角形,
  76. 判断其他点是否都在这个三角形的同侧,
  77. 是则说明这个三角形一定是凸包的一个面。
  78. */

话说一开始忘了怎么求平面的法向量,手推了个公式然后发现搞出NaN了……因为我推的公式默认法向量在z维的长度不为0,但其实有很多平面的法向量是垂直于z轴的,然后就除零爆炸了……又脑补了很久,后来才想起来两个向量的叉积必定同时垂直于这两个向量……这人没救了

还有一件事,这题卡精度,随机扰乱搞得太大会炸精度……计算几何毁我青春

Hnoi2004 金属包裹的更多相关文章

  1. bzoj 1209: [HNOI2004]最佳包裹 三维凸包

    1209: [HNOI2004]最佳包裹 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 160  Solved: 58[Submit][Status] ...

  2. BZOJ1209 [HNOI2004]最佳包裹 三维凸包 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1209 题目概括 给出立体的n个点.求三维凸包面积. 题解 增量法,看了一天,还是没有完全懂. 上板 ...

  3. 洛谷P2287 [HNOI2004]最佳包裹(三维凸包)

    题面 传送门 题解 左转板子,调个精度就能\(A\)了 //minamoto #include<bits/stdc++.h> #define R register #define fp(i ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. BZOJ 1212: [HNOI2004]L语言 [AC自动机 DP]

    1212: [HNOI2004]L语言 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1367  Solved: 598[Submit][Status ...

  6. 如何让include标签包裹的布局置于屏幕最下方?

    如何让一个Layout 始终在屏幕的下方 我想让<include layout="@layout/bottom" />一直在屏幕下,怎么做? 1.相对布局中用属性  a ...

  7. float包裹性与破坏性及清除浮动几种方法

    1. “清除浮动” ??准确的描述应该是“清除浮动造成的影响”  学习视频录制推荐的教程<CSS深入理解之float浮动> 2.如何清除浮动造成的影响??? 栗子 块级div元素包含一个内 ...

  8. Vijos1450 包裹快递[二分答案]

    背景 小K成功地破解了密文.但是乘车到X国的时候,发现钱包被偷了,于是无奈之下只好作快递员来攒足路费去Orz教主…… 描述 一个快递公司要将n个包裹分别送到n个地方,并分配给邮递员小K一个事先设定好的 ...

  9. python--基础学习(五)参数位置传递、关键字传递、包裹传递及解包裹

    python系列均基于python3.4环境 1.位置传递和关键字传递 代码示例 #位置传递 def fun(a,b,c): print("a: {0}, b: {1}, c: {2}&qu ...

随机推荐

  1. Jsp页面跳转和js控制页面跳转的几种方法

    Jsp 页面跳转的几种方法 1. RequestDispatcher.forward() 在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servle ...

  2. nginx克隆之后问题

    [alert] kill(2942, 1) failed (No such process) 背景:虚拟机克隆之后启动service nginx reload报这个错,而且没有日志 根据这个博文htt ...

  3. UICollectionView 自定义横向排版

    .h #import <UIKit/UIKit.h> @interface JHCollectionViewFlowLayout : UICollectionViewFlowLayout ...

  4. UltraFast设计法实践(1) -- 初始设计检查

    目录 1. report_failfast 1.1 命令使用 1.2 优化 1.3.总结 2.report_timing_summary 3. report_methodology 4. 总结 5.遗 ...

  5. 矩阵&&高斯消元

    矩阵运算: \(A\times B\)叫做\(A\)左乘\(B\),或者\(B\)右乘\(A\). 行列式性质: \(1.\)交换矩阵的两行(列),行列式取相反数. \(2.\)某一行元素都\(\ti ...

  6. ABP相关网站

    ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开源项目:https://github.com/aspnetboilerplate 系列文章 ...

  7. UBoot常用命令及内核下载与引导

    一.常用命令 1. 获取帮助 ① help 或 ? 2. 环境变量与相关命令 (1)环境变量 ① bootdely ② baudrate ③ netmask ④ ethaddr ⑤ bootfile ...

  8. js 面向对象 定时器 046

    获取DOM对象补充 document.getElementsByTagName('div'); //获取的多个DOM对象 这种对象叫伪数组 如果想遍历此对象 通过for(var i=0; i < ...

  9. c# 水晶报表使用说明

    水晶报表介绍 水晶报表是 vs 早期版本自带的一款报表控件.vs2017不自带水晶报表,需要自行安装.虽然水晶报表是收费控件,但是微软已经付过钱了,所以vs自带的水晶报表可以直接使用. 如果项目是 . ...

  10. python+selenium打开浏览器报错问题

    报关键字,升级selenium版本 若打开IE浏览器,停在IE界面,无法跳转对应的地址,设置一下IE的页面缩放,设置为100%