【题解】「ZJOI2007」粒子运动

https://www.luogu.com.cn/problem/P4682

第一道需要脑子的计算几何

首先我们可以对于没有每一个粒子求出她的运动轨迹。

image

设初始坐标为 \((x_0,y_0)\),方向向量为 \(\vec v\),本次碰撞时间为 \(t\),则有:

\[\begin{aligned} &(x_0+x_vt)^2+(y_0+y_vt)^2=R^2\\ \Rightarrow~&(x_v^2+y_v^2)t^2+2(x_0x_v+y_0y_v)t+x_0^2+y_0^2-R^2=0\\ \Rightarrow~&t=\dfrac{-2(x_0x_v+y_0y_v)\pm\sqrt{4(x_0x_v+y_0y_v)^2-4(x_v^2+y_v^2)(x_0^2+y_0^2-R^2)}}{2(x_v^2+y_v^2)}\\ \Rightarrow~&t=\dfrac{-2(x_0x_v+y_0y_v)+2\sqrt{-(x_vy_0-y_vx_0)^2+x_v^2R^2+y_v^2R^2}}{2(x_v^2+y_v^2)} \end{aligned} \]

所以 \(\vec {OD}=(x_0+x_vt,y_0+y_vt)\)

(为什么题解都是用角算的 \(\vec v^\prime\) 啊,感觉精度难崩,而且每次还会求出两个解,需要再代入验证,真是不优雅(自己试一下用对称来理解。

算了,还是用角度方便一点 😰

\(\alpha\)\(\vec v\)\(\vec {OD}\) 的旋转角,则 \(\vec v^\prime\)\(\vec v\) 顺时针旋转 \(\pi-2\alpha\),即逆时针旋转 \(\pi+2\alpha\) 得到的。

\[\vec v^\prime=(x_v\cos \alpha-y_v\sin\alpha,x_v\sin\alpha+y_v\cos\alpha) \]

然后用叉积算 \(\alpha\),因为她可以反映方向,而点积只能反映锐角/钝角。

\[\alpha=\text{asin}\left(\dfrac{\vec v\times \vec {OD}}{|\vec v||\vec {OD}|}\right) \]


接着,我们枚举点对,但是我们发现还有时间相同的限制,根据每次碰撞的时间将整个过程分成之多 \(2k\) 个段,但是很难直接看出来最近点是在那个时刻点取得。(然后开始借鉴

设当前我们枚举到的点对为 \((i,j)\),开始时坐标向量分别为 \(\vec P_i,\vec P_j\),速度向量分别为 \(\vec v_i,\vec v_j\),经过了 \(t\) 的时间。

这里推坐标的式子的时候,可以先用向量,化到最简后再代入坐标形式。

两点间的距离即为向量差的模长。

考虑用函数表达出来:

\[\begin{aligned} dis(i,j)&=dis(\vec P_i+\vec v_it,\vec P_j+\vec v_jt)\\ &=|\vec P_i-\vec P_j+(\vec v_i-\vec v_j)t|\\ \end{aligned} \]

显然,\(P_i-P_j,v_i-v_j\) 都是很好求的。这样就简化运算了。接着设 \(\vec p=\vec P_i-\vec P_j,~\vec v=\vec v_i-\vec v_j\)

于是:

\[\begin{aligned} dis(i,j)&=\sqrt{(x_p+x_vt)^2+(y_p+y_vt)^2}\\ &=\sqrt{(x_v^2+y_v^2)t^2+2(x_px_v+y_vy_p)t+x_p^2+y_p^2}\\ \end{aligned} \]

然后我们惊奇的发现这是一个一元二次函数。(其实也不惊奇,其实感觉出来她是一个单峰函数(本来想三分的,但是没有严格证明

于是我们取 \(t=-\dfrac{x_px_v+y_vy_p}{x_v^2+y_v^2}\)

\[\begin{aligned} dis(i,j)_\min&=\sqrt{\dfrac{(x_px_v+y_vy_p)^2}{x_v^2+y_v^2}-2\dfrac{(x_px_v+y_vy_p)^2}{x_v^2+y_v^2}+x_p^2+y_p^2}\\ &=\sqrt{\dfrac{-2x_px_vy_vy_p+x_v^2y_p^2+y_v^2x_p^2}{x_v^2+y_v^2}}\\ &=\dfrac{x_vy_p-y_vx_p}{\sqrt{x_v^2+y_v^2}}\\ &=\dfrac {\vec v\times \vec p}{|\vec v|} \end{aligned} \]

wait!

我们还需要考虑这个 \(t\) 能不能取到。

(实际上也没必要退这么久的式子,除了减少一点常数一无是处


Record

注意答案跟 0 取 max

posted @ 2024-07-28 13:34  CloudWings  阅读(4)  评论(0编辑  收藏  举报