题解:P13914 [CSPro 26] PS 无限版

· · 题解

五种操作都是仿射变换。如果我们能维护一个区间内所有 x,y,x^2,y^2 的和,我们就能轻松回答第六和第七种操作。把仿射变换矩阵写出来:

\begin{bmatrix} x'\\ y'\\ 1 \end{bmatrix} = \begin{bmatrix} a & b & c\\ d & e & f\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x\\ y\\ 1 \end{bmatrix}

展开后可以得到:

\left\{\begin{matrix} x'= ax + by + c \\ y'= dx + ey + f \end{matrix}\right.

遇到区间操作,考虑扔到线段树上去维护。懒标记线段树需要分析三点:节点和节点合并、标记和标记合并、节点和标记合并。节点信息维护 \sum_{i=1}^n x_i,\sum_{i=1}^n y_i, \sum_{i=1}^n x_i^2, \sum_{i=1}^n y_i^2, \sum_{i=1}^n x_i y_i。懒标记维护仿射变换矩阵中的 a,b,c,d,e,f,其幺元即为对角矩阵(a=1,b=0,c=0,d=0,e=1,f=0)。

节点和节点用脚合并,直接加起来就行。

标记和标记合并即将两个矩阵相乘。注意我使用的列矩阵,所以后来的标记 V 应该左乘到矩阵 U 上:

\begin{bmatrix} V_a & V_b & V_c\\ V_d & V_e & V_f\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} U_a & U_b & U_c\\ U_d & U_e & U_f\\ 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} U_a V_a + U_d V_b & U_b V_a + U_e V_b & U_c V_a + U_f V_b + V_c\\ U_a V_d + U_d V_e & U_b V_d + U_e V_e & U_c V_d + U_f V_e + V_f\\ 0 & 0 & 1 \end{bmatrix}

最后考虑如何合并信息与标记。

\left\{\begin{matrix} \sum_{i=1}^n x_i' &=& \sum_{i=1}^n\left(ax_i+by_i+c\right) = a\sum_{i=1}^n x_i + b\sum_{i=1}^n y_i + cn \\ \sum_{i=1}^n y_i' &=& \sum_{i=1}^n\left(dx_i+ey_i+c\right) = d\sum_{i=1}^n x_i + e\sum_{i=1}^n y_i + fn \\ \sum_{i=1}^n x_i'^2 &=& \sum_{i=1}^n \left(ax_i+by_i+c\right)^2=\sum_{i=1}^n \left(a^2x_i^2+b^2y_i^2+c^2+2abx_iy_i+2acx_i+2bcy_i\right) \\ &=& a^2\sum_{i=1}^n x_i^2 + b^2 \sum_{i=1}^n y_i^2 + c^2n + 2ab \sum_{i=1}^nx_iy_i + 2ac\sum_{i=1}^n x_i + 2bc \sum_{i=1}^n y_i \\ \sum_{i=1}^n y_i'^2 &=& \sum_{i=1}^n \left(dx_i+ey_i+f\right)^2=\sum_{i=1}^n \left(d^2x_i^2+e^2y_i^2+c^2+2dex_iy_i+2dfx_i+2efy_i\right) \\ &=& d^2\sum_{i=1}^n x_i^2 + e^2 \sum_{i=1}^n y_i^2 + f^2n + 2de \sum_{i=1}^nx_iy_i + 2df\sum_{i=1}^n x_i + 2ef \sum_{i=1}^n y_i \\ \sum_{i=1}^n x_iy_i &=& \sum_{i=1}^n\left(ax_i+by_i+c\right)\left(dx_i+ey_i+f\right) \\ &=&\sum_{i=1}^n\left(adx_i^2+bey_i^2+cf+\left(ae+bd\right)x_iy_i+\left(af+cd\right)x_i+\left(bf+ce\right)y_i\right) \\ &=&ad\sum_{i=1}^n x_i^2 +be\sum_{i=1}^n y_i^2+cfn+\left(ae+bd\right)\sum_{i=1}^nx_iy_i+\left(af+cd\right)\sum_{i=1}^n x_i+\left(bf+ce\right)\sum_{i=1}^n y_i \end{matrix}\right.

数据结构部分也就做完了。再讨论一下五种操作。注意以下矩阵都是左乘的,需要从右往左读。你也不需要实际计算出这些结果,按照顺序在线段树上依次操作即可。

平移:设变换矩阵为 A。由

\left\{\begin{matrix} x'=x + a \\ y'=b + b \end{matrix}\right.

可知 A_a=1,A_b=0,A_c=a,A_d=0,A_e=1,A_f=b。因此

A=\begin{bmatrix} 1 & 0 & a\\ 0 & 1 & b\\ 0 & 0 & 1 \end{bmatrix}

绕点旋转:平移两点,使得旋转中心与原点重合。此时绕原点旋转,是线性变换。再平移回去即可。

\begin{bmatrix} 1 & 0 & a\\ 0 & 1 & b\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & -a\\ 0 & 1 & -b\\ 0 & 0 & 1 \end{bmatrix}

以点为中心缩放:同理,转化为按原点为中心缩放的线性变化问题。

\begin{bmatrix} 1 & 0 & a\\ 0 & 1 & b\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \lambda & 0 & 0\\ 0 & \lambda & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & -a\\ 0 & 1 & -b\\ 0 & 0 & 1 \end{bmatrix}

轴对称:向下平移 b,再绕原点顺时针旋转 \theta,此时对称轴变为 x 轴,y 坐标乘 -1 即可。然后再倒腾回去。

\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & y_0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos\left(-\theta\right) & -\sin\left(-\theta\right) & 0\\ \sin\left(-\theta\right) & \cos\left(-\theta\right) & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & -y_0\\ 0 & 0 & 1 \end{bmatrix}

投影:同理,转化为投影到 x 轴,y 坐标乘 0 即可。再倒腾回去。

\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & y_0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos\theta & -\sin\theta & 0\\ \sin\theta & \cos\theta & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & 0 & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} \cos\left(-\theta\right) & -\sin\left(-\theta\right) & 0\\ \sin\left(-\theta\right) & \cos\left(-\theta\right) & 0\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & -y_0\\ 0 & 0 & 1 \end{bmatrix}

还有两种询问。

询问 6:输出 \frac{1}{m} \sum_{i=1}^m x_i\frac{1}{m} \sum_{i=1}^m y_i

询问 7:输出

\sum_{i=1}^m \left(\left(x_i-a\right)^2+\left(y_i-b\right)^2\right)=\sum_{i=1}^m \left(x_i^2-2x_ia+a^2+y_i^2-2y_ib+b^2\right) \\ =\sum_{i=1}^m x_i^2-2a\sum_{i=1}^m x_i+ma^2+\sum_{i=1}^m y_i^2-2b\sum_{i=1}^m y_i+mb^2