题意

求三维凸包的表面积。

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. Elasticsearch配置安装

    跨域  elasticsearch-head连接es时会提示连接失败,有可能就是没有开启跨域 http.cors.enabled 是否支持跨域,默认为false http.cors.allow-ori ...

  2. oracle加密--wallet

    SQL> SELECT * FROM V$ENCRYPTION_WALLET; WRL_TYPE WRL_PARAMETER STATUS -------------------- ------ ...

  3. 如何利用 iTunes 把 m4a/wav 文件转成 MP3 格式

    MAC技巧 | 如何利用 iTunes 把 m4a/wav 文件转成 MP3 格式 - 简书

  4. PowerBuilder学习笔记之8.5高级窗口控件

    1.列表框控件 列表框控件(ListBox).图片列表框控件(PictureListBox).下拉列表框控件(DropDownListBox)以及下拉图片列表框控件(DropDownPictureLi ...

  5. C#倒计时关闭提示框

    前两天实现某个功能需要做一个提示框 并且能够自动关闭的,就从网上搜了一个能够自动关闭的提示框 ,但由于我需要的场景是不确定计时时间的,所以并没有使用到该窗体,但是我觉得可以留存备用 ,后边也把我 这种 ...

  6. 数据结构与算法(周测3-Huffman树)

    判断题 1.Given a Huffman tree for N (≥2) characters, all with different weights. The weight of any non- ...

  7. Windows下编译 Hadoop

    Windows下编译 Hadoop-2.9.2 系统环境 系统: Windows 10 10.0_x64 maven: Apache Maven 3.6.0 jdk: jdk_1.8.0_201 Pr ...

  8. vue 将时间戳转换成日期格式 (一)

    (1)创建一个处理时间格式的js,内容如下: ../../utils/formatDate.js export function formatDate(date, fmt) { if (/(y+)/. ...

  9. iOS testflight 使用说明

    一.告知开发者苹果手机的账户邮箱 1.通过任何形式告知即可 2.下载testflight 二.开发者发送激活邮件到测试者的账户邮箱 1.进入邮箱查看邮件点击 Accept invitation 进行下 ...

  10. flask-sqlalchemy使用及数据迁移

    flask-sqlalchemy是flask框架在sqlalchemy基础上改造的一个orm框架 现在有两个实体Article文章和Category分类 一个分类下可能有多篇文章 相关示例: 项目相关 ...