1. 程式人生 > 其它 >LOJ6803「ICPC World Finals 2020」勝利者,我們的向量是什麼?/ 3.10 校內考試 snail 題解

LOJ6803「ICPC World Finals 2020」勝利者,我們的向量是什麼?/ 3.10 校內考試 snail 題解

給定 \(n\)\(d\) 維向量 \(v_i\) 和與 \(n\) 個數 \(e_i\),求一個 \(d\) 維向量 \(\pmb{x}\) 滿足 \(\|\pmb{x} - \pmb{v_i}\| = e_i\)保證有解
\(n, d \le 500\)


  數學 高斯消元 線性方程組 構造

  這篇題解很大一部分參考了 Alex_Wei 的題解,然後輔助了一些自己的理解,同時有一部分證明是看 王總的題解 想到的,在此表示感謝。

  好題。當初考試的時候有三擋分 \(d = 2\) 和保證唯一解以及沒有限制,然後只會前面兩檔,然後不太會後面的拓展了/kk。

  首先,對於保證唯一解,是一個比較經典的題目,

[JSOI2008]球形空間產生器

  為了方便後文表述,我們可以令 \(\pmb{x} \gets \pmb{x} - \pmb{v_1}\),然後將更新所有給出的值,最後將答案 \(+\pmb{v_1}\),然後有如下方程:

\[\left\{ \begin{aligned} &\| \pmb{x} \| = e_1\\ &\| \pmb{x} - \pmb{v_i} \| = e_i(i > 1) \end{aligned} \right. \]

  根據[JSOI2008]球形空間產生器這個題目,我們可以對於上面 \(i>1\) 的式子,進行差分,列出方程,然後可以解出 \(\pmb{x}\)

的取值是一個常數向量 \(\pmb{x_{base}}\) + 若干向量的線性組合。

比如我們通過前面的方程,解出來發現 \(x_2, x_4\) 是自由元,那麼有方程:

\[\left\{ \begin{aligned} x_1 &= 114 + 19x_2 + 19x_4\\ x_3 &= 514 + 8x_2 + 10x_4\\ \end{aligned} \right. \]

於是解為:

\[\left\{ \begin{aligned} x_1 &= 114 + 19x_2 + 19x_4\\ x_2 &= x_2\\ x_3 &= 514 + 8x_2 + 10x_4\\ x_4 &= x_4 \end{aligned} \right. \]

也就是我們的解:

\[\pmb{x} = \begin{bmatrix} 114 \\ 0 \\ 514 \\ 1 \end{bmatrix}+ x_2\begin{bmatrix} 19 \\ 1 \\ 8 \\ 0 \end{bmatrix}+ x_4\begin{bmatrix} 19 \\ 0 \\ 10 \\ 1 \end{bmatrix} \]

於是 \(\pmb{x_{base}} =\begin{bmatrix}114 \\0 \\514 \\1\end{bmatrix}\),然後 \(\pmb{x} = \pmb{x_{base}} + x_2\pmb{t_2} + x_4\pmb{t_4}\),其中 \(\pmb{x_{base}}\)\(\pmb{t_2}\) 等都是一個 \(d \times 1\) 的向量。

  於是,也就是 \(\pmb{x} = \pmb{x_{base}} + \sum_{i = 1}^r c_i \pmb{t_i}\)

  我們令 \(T = \begin{bmatrix} \pmb{t_1} | \pmb{t_2} | \dots | \pmb{t_r}\end{bmatrix}\),其中 \(r\) 代表我們的自由元數量,這個矩陣是 \(d \times r\) 的,再令一個 \(r \times 1\) 的列向量 \(\pmb{c}\) 代表 \(c_i\) 的解,那麼就有 \(\pmb{x} = \pmb{x_{base}} + T\pmb c\)

  然後我們還要滿足一個條件 \(\| \pmb{x} \| = e_1\),那麼可以求出 \(\pmb{x}\) 的最小范數解 \(\pmb{x_{\min}}\),我們可以發現,最小范數解 \(\pmb{x_{\min}}\) 一定和所有 \(\pmb{t_i}\) 是垂直的,如果和某個 \(\pmb{t_i}\) 不垂直,我們可以讓 \(\pmb{x} = \pmb{x_{\min}} + k\pmb{t_i}\) 使得 \(\pmb{x} \bot \pmb{t_i}\),然後可以發現 \(\| \pmb{x}\| < \| \pmb{x_{\min}}\|\)

為什麼可以發現 \(\| \pmb{x}\| < \| \pmb{x_{\min}}\|\) 呢?

目前我可能想到的是可以把整個圖形想象成為一個多維立體空間,然後 \(\pmb{x}\)\(\pmb{x_{\min}}\) 以及 \(k\pmb{t_i}\) 的關係類似與一個直角三角形,其中 \(\pmb{x_{\min}}\) 是斜邊,因此 \(\| \pmb{x}\| < \| \pmb{x_{\min}}\|\)

不知到還有沒有其他的證明方式,據 Alex_Wei 說可以根據數值分析,但是不太會,有時間想明白再補上吧。

  然後我們可以發現 \(\pmb{x_{\min}}\cdot \pmb{t_i} = 0\),然後可以轉化為 \(T^{T}(\pmb{x_{base}}+T\pmb{c}) = \pmb{0}\),然後可以直接高斯消元求出 \(\pmb{x_{\min}}\) 了。

  求出來之後可以直接使用勾股定理,選擇一個向量 \(\pmb{t_1}\),然後 \(\pmb{x} = \pmb{x_{\min}}+\sqrt{e_1^2 - \| \pmb{x_{\min}\|}} \frac{\pmb{t_1}}{\| \pmb{t_1} \|}\) 就行了。
  程式碼見 這裡