传送门

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

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

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

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

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
const int maxn=;
const long double eps=1e-;
struct Point{
long double x,y,z;
Point(long double x=0.0,long double y=0.0,long double z=0.0):x(x),y(y),z(z){}
Point operator-(const Point &a)const{return Point(a.x-x,a.y-y,a.z-z);}//A - B = B到A的位移
Point operator/(const long double &a)const{return Point(x/a,y/a,z/a);}
}a[maxn];
typedef Point Vector;
long double noise();
long double Dot(const Vector&,const Vector&);
Vector Cross(const Vector&,const Vector&);
long double Length(const Vector&);
long double Area2(const Point&,const Point&,const Point&);
Vector LawVector(const Vector&,const Vector&);
long double Distance(const Point&,const Point&,const Vector&);
ifstream fin("enwrap.in");
ofstream fout("enwrap.out");
long double ans=0.0;
int n,t;
int main(){
fin>>n;
for(int i=;i<=n;i++){
fin>>a[i].x>>a[i].y>>a[i].z;
a[i].x+=noise();
a[i].y+=noise();
a[i].z+=noise();
}
Vector A;
long double d;
bool bad;
for(int i=;i<=n;i++)for(int j=;j<i;j++)for(int k=;k<j;k++){
bad=false;
t=;
A=LawVector(a[j]-a[i],a[k]-a[i]);
for(int l=;l<=n;l++)if(i!=l&&j!=l&&k!=l){
d=Distance(a[l],a[i],A);
if(!t)t=(d<?-:);
else if(t*d<){
bad=true;
break;
}
}
if(!bad)ans+=Area2(a[i],a[j],a[k]);
}
ans/=2.0;
fout<<fixed<<ans;
return ;
}
long double noise(){
static int a=,b=,p=,x=;
x=a*x+b;x%=p;
if(x<)x+=p;
return (long double)(x-p)/p*5e-;
}
inline long double Dot(const Vector &A,const Vector &B){return A.x*B.x+A.y*B.y+A.z*B.z;}
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);}
inline long double Length(const Vector &A){return sqrt(Dot(A,A));}
inline long double Area2(const Point &A,const Point &B,const Point &C){return Length(Cross(B-A,C-A));}
inline Vector LawVector(const Vector &A,const Vector &B){
Vector n=Cross(A,B);
return n/Length(n);
}//两个向量的叉积一定同时垂直于这两个向量
inline long double Distance(const Point &A,const Point &P,const Vector &n){return Dot(A-P,n);}//(P,n)是平面的点法式,n是单位向量
/*
三维凸包——暴力法
暴力枚举三个点组成的三角形,
判断其他点是否都在这个三角形的同侧,
是则说明这个三角形一定是凸包的一个面。
*/

话说一开始忘了怎么求平面的法向量,手推了个公式然后发现搞出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. dotnet --info

    [root@bogon ~]# dotnet --info.NET Command Line Tools (2.1.4) Product Information: Version: 2.1.4 Com ...

  2. POJ2259 Team Queue (JAVA)

    第一次TLE,对每个group重新设置Queue中定位,定位到每个group的最后一个元素,但WA 经过检查,DEQUEUE时没有根据情况重新计算group,插入时没有根据情况重新给last赋值 贴A ...

  3. Linux kill 指定进程名的四种方式

    方法1 pkill 进程名 方法2 killall 进程名 方法3 kill -9 $(ps -ef|grep 进程名关键字|grep -v grep|awk '{print $2}') 这个是利用管 ...

  4. 修改ZuulHandlerMapping私有变量pathMatcher,重写match方法,使url匹配兼容正则表达式。

    一.起源 在mocksever中引入了spring cloud zuul做代理转发,如果请求的url和配置的mock规则匹配(精确匹配和模糊匹配),忽略,不做转发.如果mock配置的url和请求url ...

  5. 进阶篇:4)面向装配的设计DFA总章

    本章目的:理解装配的重要性,明确结构工程师也要对装配进行设计. 1.基础阅读 ①进阶篇:1)DFMA方法的运用: ②需要一台FDM3d打印机:请查看 基础篇:8)结构设计装备必备: 2.为什么要学习D ...

  6. Entity Framework添加记录时获取自增ID值

    与Entity Framework相伴的日子痛并快乐着.今天和大家分享一下一个快乐,两个痛苦. 先说快乐的吧.Entity Framework在将数据插入数据库时,如果主键字段是自增标识列,会将该自增 ...

  7. django中使用时间帅选报RuntimeWarning: DateTimeField Coupon.valid_begin_date received a naive datetime (2018-08-16 20:51:40.135425) while time zone support is active.

    今天在使用当前时间进行筛选数据时出现了RuntimeWarning: DateTimeField Coupon.valid_begin_date received a naive datetime ( ...

  8. odoo 二次开发的方法

    介绍 二开时模型创建完毕并配好视图后对于基本的CRUD操作不需要再在代码中实现,框架会自动提供这些功能,但如果我们的开发需求不仅仅是对当前对象的CRUD时,就需要在框架原来方法的基础上扩展出一些自己所 ...

  9. Vue学习笔记 template methods,filters,ChromeDriver,安装sass

    ChromeDriver installation failed Error with http(s) request: Error: connect ETIMEDOUT 172.217.160.80 ...

  10. Junit打包测试

    在一个项目中,只写一个测试类是不可能的,我们会写出很多很多个测试类.可是这些测试类必须一个一个的执行,也是比较麻烦的事情. 鉴于此, JUnit 为我们提供了打包测试的功能,将所有需要运行的测试类集中 ...