SDOI2016 平凡的骰子

题目大意

给定一个 M 个面N个点的凸多面体,设 O 为该凸多面体的重心,以O为球心做单位球 C 。对于每个面,设其点集为S,对于所有 i ,做O Si 的连线,线必与 C 有交点,那么对于一个面,就有一个交点集合也是一个球面T。一个面的权值是其 T 的面积除以4π。问每个面的权值是多少。

数据范围

N,M100

题解

这道题考了很多结论,所以我考场上根本不会做。。
首先我们需要求出凸多面体的重心。假如这个凸多面体是一个四面体,那么其重心的坐标就是所有点的坐标的均值。因此,我们可以考虑将原来的凸多面体剖分为若干个四面体来求。我们可以在凸多面体内随便选一个点,实际中用端点比较方便。然后对于每个面,我们可以对其三角剖分,每个三角形与选定的点就形成了四面体。设 Vi 表示第 i 个四面体的体积,Oi表示其重心,那么凸多面体的重心就是:
O=iViOiiVi
要求四面体的体积,我们可以先用混合积求出平行六面体的体积再除以6就好了。
接下来我们就需要对于每个面求出其对应的球面的面积。
假设当前面为一个三角形,那么这个三角形在球上的投影必然是一个球三角形。
比如说这幅图:
这里写图片描述
ABC 为对应的三个投影点的内角, a,b,c 为三条边,边是圆弧。那么根据wikipedia上的公式,我们有:
SΔ=A+B+Cπ
cos(c)=cos(a)cos(b)+sin(a)sin(b)cos(C) ,其他同理。
那么现在的问题就是如何求cos(a),cos(b),cos(c)。
因为我们已经知道了重心到三个点的向量,那么我们可以直接点积一下再反三角就可以得到 a,b,c 了,那么这个三角形的面积就知道了。
假如一个面不是三角形,那么我们一样可以对其三角剖分,问题就被解决了。
时间复杂度为 O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值