一類初等函式下取點問題

zsxuan發表於2024-07-29

等差數列方向

\(N\) 棵樹,第 \(i\) 棵樹的座標是 \(a_i \ (-M \leq a_i \leq M)\) 。可以花費 \(b_i\) 的代價將 \(a_i\) 修改為任意整數。詢問 \(a_1, a_2, \cdots, a_N\) 構成等差數列需要的最小代價。

思路:
\(a_1, a_2, \cdots, a_N\) 是等差數列,則 \((i, a_i)\) 在二維空間上落在一條直線 \(y = A_1 + (d - 1)x = c + kx\) 上,且 \(k = 0 \vee 1 \mid k\)

由於 \(f(x) = c x^{0} + k x^{1}\)\(deg\)\(1\) 的多項式,根據插值理論或線性代數理論,可以用兩個點確定。

一個經典的 trick 是: 直線經過至少一個點一定比不經過點更優。

  • 如果以兩點式處理,則直線經過兩個點比經過一個點和經過更多點更優。

  • 或者以點斜式處理,只需列舉一個斜率,且經過一個點。

方向一:

從兩點式考慮。

我們可以 \(O(N^{2})\) 列舉兩個點,然後計算這兩個點對應直線的貢獻。

可以藉助直線的一般式 \(Ax + By + C = 0\) (一般是需要約分)維護直線,用 \(\{(A, B, C), value\}\) 表示每條直線上點的 \(b_i\) 貢獻和。

答案就是 \(\sum b_i - max\{value\}\) ,時間複雜度 \(O(N^{2} \log N^{2})\)

方向二:

從點斜式考慮。

重新確定 \(a\) 陣列是從 \(0\) 編號的,即 \(a\) 陣列為 \(a_0, a_1, a_2, \cdots, a_{N - 1}\) 。這樣可以讓第一個點在 \(y\) 軸上,方便點斜式的討論。

我們考慮一條過 \((0, -M)\) 的直線 \(f(x) = -M + kx\)

我們可以取直線過另一個點 \((1, M), (2, M), (3, M), \cdots, (N - 1, M), (N - 1, M - 1), (N - 1, M - 2), \cdots, (N - 1, -M)\) ,初步有 \(0 \leq k \leq 2M\)

又注意到等差數列構成的直線,斜率要麼是 \(0\) ,要麼是 \(1\) 的倍數。則 \(k = 0\) 或者 \(1 \leq k \leq 2M\)

由於答案直線過 \((0, A)\)\(A \geq -M\) ,則在 \(f(x)\) 下面的所有點一定要改,而可能要改的是嚴格在 \(f(x)\) 上方的點,不妨稱這些點為有效點。

\(k = 0\) 時可以維護鍵值對 \((y, value)\) ,對所有存在的 \(a_i\) 權值,計算對應的若干點的 \(b_i\) 貢獻。時間複雜度 \(O(N \log N)\)

所以只需考慮 \(1 \leq k \leq 2M\)

不難發現直線 \(f(x)\) 經過點 \((i, -M + ki)\) ,而有效點是一段字首滿足 \(-M + ki \leq M\) 。繼而有 \(\forall i, i \leq \lfloor \frac{2M}{k} \rfloor\) 的點為有效點。

\[\sum_{k = 1}^{2M} \lfloor \frac{2M}{k} \rfloor < \sum_{k = 1}^{+\infty} \frac{2M}{k} \leq 2M \ln 2M = O(M \log M) \]

顯然有效點的個數為 \(O(M \log M)\) ,同時每個有效點可以根據點斜式確定一條直線。

現在考慮答案直線 \(l = A_0 + k(i - 1)\)\(l\) 經過一個點會更優,可以列舉所有有效點作為一個固定點。

假設此時的列舉的斜率是 \(k\) ,列舉的固定有效點是 \(a_i\) ,則 \(A_0 + k(i - 1) = a_i \Rightarrow A_0 = a_i - k(i - 1)\)

可以維護鍵值對 \(\{(A_0, k), value\}\) ,對每個固定點計算它對對應直線的 \(b_i\) 貢獻。

獲得貢獻最大的直線 \(l = A_0 + k(i - 1)\) ,是需要修改貢獻最少的直線。

最後我們讓這根直線和 \(O(N)\) 跳斜率為 \(0\) 的直線取更優值。

總時間複雜度為 \(O(M \log M)\)

等比數列方向

\(N\) 棵樹,第 \(i\) 棵樹的座標是 \(a_i (0 \leq a_i \leq M)\) 。可以花費 \(b_i\) 的代價將 \(a_i\) 修改為任意非負整數。詢問 \(a_1, a_2, \cdots, a_N\) 構成等比數列需要的最小代價。

這裡限定為正數是因為非初等函式的處理非常困難。

思路:

\(a_1, a_2, \cdots, a_N\) 是等比數列,則 \((i, a_i)\) 在二維空間上落在 \(y = A_1 q^{x - 1}\) 上。

要麼 \(q = 1\)\(f(x) = A_1 q^{x - 1}\) 是一條直線,可以透過維護 \((y, value)\)\(O(N \log N)\) 算出這種每個權值的獲得的點的 \(b_i\) 貢獻。

否則 \(q > 0 \wedge q \neq 1\) 。(題目不需要同時討論 \(q < 0\) 的情況,因為這很困難)

這時 \(f(x) = A_1 q^{x - 1}\) 並不是一個多項式,不能透過若干個點確定。

但至少是一個透過常函式 \(c\) 乘以指數函式 \(a^{x} \ (a \neq 1 \wedge a > 0)\) 得到的初等函式,是一條簡單曲線,依舊具有簡單的性質。

這個初等函式首先可以透過一個公比 \(q(q > 0)\) 和一個點 \((1, A_1)\) 確定。

根據經典 trick\(f(x) = A_1 q^{x - 1}\) 至少經過一個點最優。

如果曲線真的只經過了一個點,不妨 \(O(N)\) 處理出 \(\sum_{i = 1}^{N} b_i - b_k\)

於是接下來考慮經過至少兩個點的曲線,這樣會使得曲線的樣本空間更小,\(q\) 的取值範圍也更小。

我們可以 \(O(N)\) 列舉一個點 \((i, a_i)\) 作為定點,然後列舉 \(q\) ,需要保證 \(q^{i - 1} \mid a_i\) 。於是可以計算出 \(A_1 = \frac{a_i}{q^{i - 1}}\)

\(\forall i \geq 2, a_i < A_1 q^{i - 1}\) ,則這些曲線依舊是隻會經過 \((i, a_i)\) 這一個點。這種情況已經被計算過。

它的逆條件是 \(\exists i \geq 2, a_i \geq A_1 q^{i}\) ,曲線可能會經過一個點以上。

\(q \leq \log_{i} \frac{a_i}{A_1} \leq \log_{2} M\) 可以限制出 \(q\) 的範圍。於是需要 \(O(N \log M)\) 列舉一條曲線。

對於任意一個定點 \(a_i\) ,我們將記錄它對 \((A_1 = \frac{a_i}{q^{i - 1}}, q)\)\(b_i\) 貢獻。維護 \(\{(A_1, q), value\}\)

這些曲線最後還要和 \(O(N)\) 條只經過一個點的曲線取更優值。

總時間複雜度為 \(O(N \log M)\)

相關文章