题意

求三维凸包的表面积。

N≤100N\le100N≤100

题解

暴力往当前的凸包里加点。O(n2)O(n^2)O(n2)。题解详见大佬博客

扰动函数shakeshakeshake是为了避免四点共面。

CODE

实测epsepseps开到1e−101e-101e−10才过

#include <bits/stdc++.h>
using namespace std;
#define il inline
const double eps = 1e-10;
const int MAXN = 105;
il double Rand() { return rand()/(double)RAND_MAX; }
il double reps() { return (Rand()-0.5)*eps; };
int n;
struct point {
double x, y, z;
il void shake() { x+=reps(); y+=reps(); z+=reps(); }
il double len() { return sqrt(x*x + y*y + z*z); }
il point operator -(point o) { return (point){ x-o.x , y-o.y, z-o.z }; }
il point operator *(point o) { return (point){ y*o.z-z*o.y, z*o.x-x*o.z, x*o.y-y*o.x }; }
il double operator &(point o) { return x*o.x + y*o.y + z*o.z; }
}A[MAXN];
struct face {
int v[3];
il point normal() { return (A[v[1]]-A[v[0]]) * (A[v[2]]-A[v[0]]); }
il double area() { return normal().len() / 2; }
}f[MAXN<<1], tmp[MAXN<<1];
bool see(face a, point b) { return ( (b-A[a.v[0]])&a.normal() ) > 0; }
int cnt;
bool vis[MAXN][MAXN];
void Convex3D() {
f[++cnt] = (face) { {1, 2, 3} };
f[++cnt] = (face) { {3, 2, 1} };
for(int i = 4, cur; i <= n; ++i) {
cur = 0;
for(int j = 1, can; j <= cnt; ++j) {
if(!(can = see(f[j], A[i]))) tmp[++cur] = f[j];
for(int k = 0; k < 3; ++k) vis[f[j].v[k]][f[j].v[(k+1)%3]] = can;
}
for(int j = 1; j <= cnt; ++j)
for(int k = 0; k < 3; ++k) {
int u = f[j].v[k], v = f[j].v[(k+1)%3];
if(vis[u][v] && !vis[v][u]) tmp[++cur] = (face){ {u, v, i} };
}
for(int j = 1; j <= cur; ++j) f[j] = tmp[j]; cnt = cur;
}
}
int main() {
srand(19260817);
cin>>n;
for(int i = 1; i <= n; ++i) cin>>A[i].x>>A[i].y>>A[i].z, A[i].shake();
Convex3D();
double S = 0;
for(int i = 1; i <= cnt; ++i) S += f[i].area();
printf("%.6f\n", S);
}

BZOJ1209 最佳包裹 (三维凸包 增量法)的更多相关文章

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

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

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

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

  3. [Luogu4724][模板]三维凸包(增量构造法)

    1.向量点积同二维,x1y1+x2y2+x3y3.向量叉积是行列式形式,(y1z2-z1y2,z1x2-x1z2,x1y2-y1x2). 2.增量构造法: 1)首先定义,一个平面由三个点唯一确定.一个 ...

  4. Luogu 4724 三维凸包

    Luogu 4724 三维凸包 增量法,维护当前凸包,每次加入一个点 \(P\) ,视其为点光源,将可见面删去,新增由"晨昏线"(分割棱)与 \(P\) 构成的平面. 注意每个平面 ...

  5. POJ 3528--Ultimate Weapon(三维凸包)

    Ultimate Weapon Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 2430   Accepted: 1173 ...

  6. 洛谷P4724 【模板】三维凸包

    题面 传送门 题解 先理一下关于立体几何的基本芝士好了--顺便全都是从\(xzy\)巨巨的博客上抄来的 加减 三维向量加减和二维向量一样 模长 \(|a|=\sqrt{x^2+y^2+z^2}\) 点 ...

  7. hdu4266(三维凸包模板题)

    /*给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面的多边形个数. 增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况: 1> 在凸包内,则可以跳过 2> ...

  8. luogu P4724 模板 三维凸包

    LINK:三维凸包 一个非常古老的知识点.估计也没啥用. 大体上了解了过程 能背下来就背下来吧. 一个bf:暴力枚举三个点 此时只需要判断所有的点都在这个面的另外一侧就可以说明这个面是三维凸包上的面了 ...

  9. HDU 4573 Throw the Stones(动态三维凸包)(2013 ACM-ICPC长沙赛区全国邀请赛)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4573 Problem Description Remember our childhood? A fe ...

随机推荐

  1. LeetCode 70. 爬楼梯(Climbing Stairs)

    70. 爬楼梯 70. Climbing Stairs 题目描述 假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 ...

  2. 使用AOP进行权限验证

    首先我们定义一个切入点(匹配com.ed.controller.Seller开头的controller的所有public方法) @Pointcut("execution(public * c ...

  3. 关于#define 的宏替换的一些问题

    #define PI 3.14; int main() { , s = ; s = r * r * PI; s = PI * r * r; // s = 3.14; * r * r; printf(& ...

  4. mininet:使用vxlan连接两台虚拟机的网络topo

    需改虚拟机的网络适配器,将其改为host-only 尝试ping宿主机ip地址,此时能够ping同与虚拟机相连的虚拟网卡ip地址,无法ping同其他网卡ip地址 在虚拟机和宿主机中创建网络topo 在 ...

  5. go String方法的实际应用

    让 IPAddr 类型实现 fmt.Stringer 以便用点分格式输出地址. 例如,`IPAddr{1,`2,`3,`4}` 应当输出 `"1.2.3.4"`. String() ...

  6. Scratch 少儿编程之旅(四)— Scratch入门动画《小猫捉蝴蝶》(中)

    本期内容概括: 了解Scratch的更多操作,用[无限循环]来更改“小猫”角色的代码: 添加[碰到边缘就反弹]积木块指令: 更改角色的旋转模式和造型,让”小猫”走路更生动: 两种[循环]语句的区别: ...

  7. QuartzNet 任务管理系统

    最近有面试!都有问道Quartz方面的问题,之前的项目有使用过,也知道怎么用,但面试时要说出它的原理,一时半会还真说不来!查阅了一些资料先记录下来吧 Quartz.NET官网地址:https://ww ...

  8. java 线程实现、线程暂停和终止 、线程联合join、线程基本信息获取和设置、线程优先级

    转载地址:速学堂 https://www.sxt.cn/Java_jQuery_in_action/eleven-inheritthread.html 1. 通过继承Thread类实现多线程 继承Th ...

  9. win10环境下,让所有程序都以管理员身份运行的办法

    记录下,备查! 打开gpedit.msc组策略编辑. 左侧依次找到:计算机配置->Window设置->安全设置->本地策略->安全选项 然后再右侧找到:用户账户控制:以管理员批 ...

  10. navigator(浏览器对象)Screen对象(屏幕)

    浅谈navigator对象: 注意:不是所有浏览器都支持 .cookieEnabled  判断是否启用了cookie  在客户端硬盘持久保存用户私密数据的小文件 .plugins 浏览器安装的所有插件 ...