「こんなきれいな星も、やっぱりここまで来てから、見れたのだと思うから。だから・・もっと遠くへ・・」

POJ3247 3D计算几何,矩阵乘法,线段树

原题地址http://poj.org/problem?id=3247

这道题是翻POJ的AC人数最少的题目时看到的…… 当时仅try神一个人AC…… 然后看了一下题目,感觉并不是非常不可做……

就是说有一个机械爪子,由N个转轴和N-1个连接它们的不可伸缩的钢管组成一条链。然后要应对两种操作,第一种是绕一个给定的向量V旋转某个转轴i转theta度,因为是刚性连接,所以i后面的的爪子和转轴会跟着一起转。第二种操作是询问一个转轴的位置。

其实这题还是不难的……

首先要想到3D向量旋转相当与矩阵乘法。 构造一个3x3的矩阵,那么旋转所得的向量就是原向量*矩阵。

这个矩阵是这样的…… 假设轴V是单位向量(x,y,z),转theta度.sint=sin(theta), cost=cos(theta), 那么矩阵就是

\[\begin{bmatrix}
\cos t+x^2(1-\cos t) & xy(1-\cos t)-z\sin t & xz(1-\cos t)+y\sin t \\
yx(1-\cos t)+z\sin t & \cos t+y^2(1-\cos t) & zy(1-\cos t)-x\sin t \\
zx(1-\cos t)-y\sin t & zy(1-\cos t)+x\sin t & \cos t+z^2(1-\cos t)
\end{bmatrix}\]

然后,就相当于给N个向量,要求支持两种操作……

第一种是把一段区间内的向量都乘以一个矩阵…… 第二种是查询前X个向量的和。

这个显然可以用线段树+懒标记完成…… 就不解释了……

注意这道题用Pascal做的话要用double,不能用extended,不然精度会挂。

这样就可以过了……

代码 https://ideone.com/o4PHY