https://vijos.org/p/1998

三维计算几何。

需要混合积求四面体体积;

四面体剖分后合并带权重心求总重心;

四面体重心的横纵坐标是四个顶点的横纵坐标的平均数;

三维差积求平面的法向量;

点积求法向量夹角(二面角)

这些知识就可以了AC此题了。

时间复杂度\(O(nf)\),注意\(n,f\leq 100\),题面描述有误。

#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 103;
const double Pi = acos(-1); struct Point {
double x, y, z;
Point(double _x = 0, double _y = 0, double _z = 0) : x(_x), y(_y), z(_z) {}
Point operator / (const double &A) const {
return Point(x / A, y / A, z / A);
}
Point operator + (const Point &A) const {
return Point(x + A.x, y + A.y, z + A.z);
}
Point operator - (const Point &A) const {
return Point(x - A.x, y - A.y, z - A.z);
}
double operator * (const Point &A) const {
return x * A.x + y * A.y + z * A.z;
}
Point operator ^ (const Point &A) const {
return Point(y * A.z - z * A.y, z * A.x - x * A.z, x * A.y - y * A.x);
}
double len() {
return sqrt(x * x + y * y + z * z);
}
} P[N], H[N * N]; double val[N * N];
int n, F[N][N], m, Htot = 0; int main() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%lf%lf%lf", &P[i].x, &P[i].y, &P[i].z);
for (int i = 1; i <= m; ++i) {
scanf("%d", &F[i][0]);
for (int j = 1; j <= F[i][0]; ++j)
scanf("%d", &F[i][j]);
} Point u = P[1];
for (int i = 1; i <= m; ++i) {
Point u2 = P[F[i][1]], v1, v2;
for (int j = 2; j < F[i][0]; ++j) {
v1 = P[F[i][j]]; v2 = P[F[i][j + 1]];
H[++Htot] = (u + u2 + v1 + v2) / 4;
val[Htot] = fabs(((v1 - u2) ^ (v2 - u2)) * (u - u2));
}
} double valtot = 0;
u = Point(0, 0, 0); for (int i = 1; i <= Htot; ++i) {
valtot += val[i];
u = u + Point(H[i].x * val[i], H[i].y * val[i], H[i].z * val[i]);
} u = u / valtot; for (int i = 1; i <= m; ++i) {
double ans = 0, co;
Point u1, u2, u3;
for (int j = 1, s1, s2; j <= F[i][0]; ++j) {
s1 = j + 1; if (s1 > F[i][0]) s1 = 1;
s2 = s1 + 1; if (s2 > F[i][0]) s2 = 1;
u1 = P[F[i][j]] - u;
u2 = P[F[i][s1]] - u;
u3 = P[F[i][s2]] - u;
u1 = (u1 ^ u2);
u3 = (u3 ^ u2);
co = u1 * u3 / u1.len() / u3.len();
ans += acos(co);
}
ans -= (F[i][0] - 2) * Pi;
printf("%.7lf\n", ans / Pi / 4);
} return 0;
}

【Vijos 1998】【SDOI 2016】平凡的骰子的更多相关文章

  1. [Sdoi2016]平凡的骰子

    描述 这是一枚平凡的骰子.它是一个均质凸多面体,表面有n个端点,有f个面,每一面是一个凸多边形,且任意两面不共面.将这枚骰子抛向空中,骰子落地的时候不会发生二次弹跳(这是一种非常理想的情况).你希望知 ...

  2. [LOJ 2070] 「SDOI2016」平凡的骰子

    [LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出 ...

  3. 【LOJ】#2070. 「SDOI2016」平凡的骰子

    题解 用了一堆迷之复杂的结论结果迷之好写的计算几何???? 好吧,要写立体几何了 如果有名词不懂自己搜吧 首先我们求重心,我们可以求带权重心,也就是x坐标的话是所有分割的小四面体的x坐标 * 四面体体 ...

  4. SDOI 2016 游戏

    树链剖分 线段树维护区间最小值,区间最大值 更新,对于每一个区间,找到当前区间的最小值的最大值,和要更新的值比较,如果比最大值还大,则此数对于以后的询问无任何贡献,直接返回即可,若有贡献,则一直递归到 ...

  5. SDOI 2016 数字配对

    题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...

  6. SDOI 2016 征途 决策单调性

    题目大意:有一个数列,将其分成m段,求最小方差 先弄出n^3的dp,打出决策点,然后发现决策点是单调递增的,决策单调性搞一搞就可以了 #include<bits/stdc++.h> #de ...

  7. SDOI 2016 生成魔咒

    题目大意:一个字符串,刚开始为空,依次在后面添加一个字符,问每次添加完字符后本质不同的字符串有多少种 后缀自动机裸题,添加字符时,更新的结点个数即为新增加的子串 #include<bits/st ...

  8. SDOI 2016 排列计数

    题目大意:一个数列A,n个元素,其中m个元素不动,其他元素均不在相应位置,问有多少种排列 保证m个元素不动,组合数学直接计算,剩余元素错位排列一下即可 #include<bits/stdc++. ...

  9. 【BZOJ 4600】【SDOI 2016】硬币游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4600 转化成nim游戏 因为对于每一个反面朝上的硬币编号可以拆成\(2^a3^bc\),选择这个硬币 ...

随机推荐

  1. Dream------scala--Tuple、Array、Map与文件操作

    1.Tuple(元组) 一般使用中,假设一个函数返回多个值,我们可以使用tuple接受这个(val (x,y) = myfunction) package com.wls.scala.hello /* ...

  2. pytorch--cnn的理解

    class Model(nn.Module): def __init__(self): super(Model, self).__init__() self.conv1 = nn.Conv2d(1, ...

  3. 一步一步搭建oracle 11gR2 rac+dg之database安装(五)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之database安装 (五)   转自 一步一步搭建oracle 11gR2 ...

  4. Tomcat实现多域名之间session共享

    最近启用二级域名后,面临一个主域名与二级域名之间 session 不能共享的问题,带来的麻烦就是用户在主域名登陆,但由于二级域名 session 不能共享 ,因此无法进行登陆的操作,对一些功能有一些影 ...

  5. liunx系统top命令详解

    ps: 1.按1可以进行 CPU各个和总CPU汇总的切换2.cpu0是最关键的,总控管理各个CPU 3.默认情况下仅显示比较重要的 PID.USER.PR.NI.VIRT.RES.SHR.S.%CPU ...

  6. Android基于XMPP Smack Openfire下学习开发IM(一)实现用户注册、登录、修改密码和注销等

    http://blog.csdn.net/h7870181/article/details/8653865 以前学习过用Scoket 建立聊天,简单的建立聊天是没问题的,但如果要实现多人复杂的聊天,后 ...

  7. NVME SSD vs SATA SSD(转)

    NVMe是个啥?未来SSD主流标准早知 关注固态硬盘的朋友应该对于这个词汇并不陌生,特别是今年NVMe也频繁出现在各大媒体文章中,随着高端SSD市场逐渐从SATA专项PCI-E时,以前的AHCI标准已 ...

  8. js数据绑定(模板引擎原理)

    <div> <ul id="list"> <li>11111111111</li> <li>22222222222< ...

  9. Jquery获取radio单选按钮的value与后面的文字

    一组单选按钮如图: <input name="classId" value="8afa94f45ba3e2c1015ba3fac6c00000" type ...

  10. 洛谷P3621风铃

    传送门啦 分析: 这个题看起来像是个树形dp,嗯,就是看起来像. 所以我们就按树形dp的思路去分析就好了,这个题是一个树形dp的变形题. 和以前建树是一样的,我们用邻接表来进行储存.利用邻接表的特性, ...