高维多面体的体积计算 + 高斯消元的一个 trick.
如果只有 $n$ 个 $n-1$ 维的点,那么凸包其实就是它们围成的高维多面体.
它的体积就是选一个起点, 将 $n-1$ 个 $n-1$ 维向量形成的矩阵的行列式绝对值除掉 $(n-1)!$ .
现在有 $n+1$ 个点,求它们形成的凸包体积.
有一个通用的结论,这 $n+1$ 个 $n-1$ 维点的凸包体积等于任选出 $n$ 个点的高维多面体体积之和 $/2$ .
枚举哪一个点没选,用高斯消元求出其余 $n$ 个点形成的高维多面体体积即可.
注意不能直接在模意义下计算,否则只能算出行列式在模意义下的值,但无法判定符号,得出绝对值.
所以必须要用真实值消元,为了避免 double 的精度误差,可以将真实值和模意义下的值分别维护.
最后根据真实值的符号决定是否对模意义下的值取相反数.
时间复杂度 $O(t\cdot n^4)$ .
1 | //%std |