专栏文章

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

P13914题解参与者 14已保存评论 13

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
13 条
当前快照
1 份
快照标识符
@mio1oewu
此快照首次捕获于
2025/12/02 11:54
3 个月前
此快照最后确认于
2025/12/02 11:54
3 个月前
查看原文
五种操作都是仿射变换。如果我们能维护一个区间内所有 x,y,x2,y2x,y,x^2,y^2 的和,我们就能轻松回答第六和第七种操作。把仿射变换矩阵写出来:
[xy1]=[abcdef001][xy1]\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}
展开后可以得到:
{x=ax+by+cy=dx+ey+f\left\{\begin{matrix} x'= ax + by + c \\ y'= dx + ey + f \end{matrix}\right.
遇到区间操作,考虑扔到线段树上去维护。懒标记线段树需要分析三点:节点和节点合并、标记和标记合并、节点和标记合并。节点信息维护 i=1nxi,i=1nyi,i=1nxi2,i=1nyi2,i=1nxiyi\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,fa,b,c,d,e,f,其幺元即为对角矩阵(a=1,b=0,c=0,d=0,e=1,f=0a=1,b=0,c=0,d=0,e=1,f=0)。
节点和节点用脚合并,直接加起来就行。
标记和标记合并即将两个矩阵相乘。注意我使用的列矩阵,所以后来的标记 VV 应该左乘到矩阵 UU 上:
[VaVbVcVdVeVf001][UaUbUcUdUeUf001]=[UaVa+UdVbUbVa+UeVbUcVa+UfVb+VcUaVd+UdVeUbVd+UeVeUcVd+UfVe+Vf001]\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}
最后考虑如何合并信息与标记。
{i=1nxi=i=1n(axi+byi+c)=ai=1nxi+bi=1nyi+cni=1nyi=i=1n(dxi+eyi+c)=di=1nxi+ei=1nyi+fni=1nxi2=i=1n(axi+byi+c)2=i=1n(a2xi2+b2yi2+c2+2abxiyi+2acxi+2bcyi)=a2i=1nxi2+b2i=1nyi2+c2n+2abi=1nxiyi+2aci=1nxi+2bci=1nyii=1nyi2=i=1n(dxi+eyi+f)2=i=1n(d2xi2+e2yi2+c2+2dexiyi+2dfxi+2efyi)=d2i=1nxi2+e2i=1nyi2+f2n+2dei=1nxiyi+2dfi=1nxi+2efi=1nyii=1nxiyi=i=1n(axi+byi+c)(dxi+eyi+f)=i=1n(adxi2+beyi2+cf+(ae+bd)xiyi+(af+cd)xi+(bf+ce)yi)=adi=1nxi2+bei=1nyi2+cfn+(ae+bd)i=1nxiyi+(af+cd)i=1nxi+(bf+ce)i=1nyi\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.
数据结构部分也就做完了。再讨论一下五种操作。注意以下矩阵都是左乘的,需要从右往左读。你也不需要实际计算出这些结果,按照顺序在线段树上依次操作即可。
平移:设变换矩阵为 AA。由
{x=x+ay=b+b\left\{\begin{matrix} x'=x + a \\ y'=b + b \end{matrix}\right.
可知 Aa=1,Ab=0,Ac=a,Ad=0,Ae=1,Af=bA_a=1,A_b=0,A_c=a,A_d=0,A_e=1,A_f=b。因此
A=[10a01b001]A=\begin{bmatrix} 1 & 0 & a\\ 0 & 1 & b\\ 0 & 0 & 1 \end{bmatrix}
绕点旋转:平移两点,使得旋转中心与原点重合。此时绕原点旋转,是线性变换。再平移回去即可。
[10a01b001][cosθsinθ0sinθcosθ0001][10a01b001]\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}
以点为中心缩放:同理,转化为按原点为中心缩放的线性变化问题。
[10a01b001][λ000λ0001][10a01b001]\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}
轴对称:向下平移 bb,再绕原点顺时针旋转 θ\theta,此时对称轴变为 xx 轴,yy 坐标乘 1-1 即可。然后再倒腾回去。
[10001y0001][cosθsinθ0sinθcosθ0001][100010001][cos(θ)sin(θ)0sin(θ)cos(θ)0001][10001y0001]\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}
投影:同理,转化为投影到 xx 轴,yy 坐标乘 00 即可。再倒腾回去。
[10001y0001][cosθsinθ0sinθcosθ0001][100000001][cos(θ)sin(θ)0sin(θ)cos(θ)0001][10001y0001]\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:输出 1mi=1mxi\frac{1}{m} \sum_{i=1}^m x_i1mi=1myi\frac{1}{m} \sum_{i=1}^m y_i
询问 7:输出
i=1m((xia)2+(yib)2)=i=1m(xi22xia+a2+yi22yib+b2)=i=1mxi22ai=1mxi+ma2+i=1myi22bi=1myi+mb2\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

评论

13 条评论,欢迎与作者交流。

正在加载评论...