CSP2024-23

Lu_xZ發表於2024-09-19

A

題意:維護序列 \(a\),支援單點修改。

每次找到滿足 \((a_1 \oplus b) \le (a_2 \oplus b) \le \cdots \le (a_n \oplus b)\) 的最小非負整數 \(b\);或判斷無解。\(1\le n, q \le 10^6\)

肯定是把大條件拆成 \(n - 1\) 個小條件,大條件成立當且僅當所有小條件成立。

  • \(a_{i} = a_{i + 1}\),隨便怎麼操作都滿足條件。
  • \(a_i < a_{i + 1}\),不能操作從高到低第一個不同位,其他隨便操作。
  • \(a_i > a_{i + 1}\),必須操作從高到低第一個不同位,其他隨便操作。

隨便記錄次數維護一下,如果矛盾則無解。submission

B

題意:給定 \(n, a\),求滿足 \(p_i \in [\max(1, i - (n - a) + 1), \min(n, i + a - 1)]\)\(n\) 階排列個數,多測。

資料範圍:\(1 \le n \le 10^6,\ a \le 200,\ a < n, T \le 10\)

當限制條件全是 \([1, \min(n, i + a - 1)]\) 時很容易做:

\(n - a\) 個數範圍為 \([1, i + a - 1]\),每個數有 \((i + a - 1) - (i - 1) = a\) 種取法(減掉前 \(i - 1\) 個數用掉的)。

\(a\) 個數範圍為 \([1, n]\),即剩下 \(a\) 個數隨意分配。此時方案數就等於 \(a^{n - a} \times a!\)

回到原問題,\(i - (n - a) + 1 > 1\) 的就是後 \(a\) 個人。考慮容斥,欽定 \(a\) 個人中有 \(j\) 個屬於 \([1, i - (n - a)]\)

由於被欽定 \(j\) 個人取值範圍一定包含於前 \(n - a\) 個人,因此前 \(n - a\) 個人每人有 \(a - j\) 種取法。

\(a\) 個人中沒被欽定的可以隨便選,\((a - j)!\) 種方案。

\(f(i, j)\) 表示 \(a = i\) 時欽定 \(j\) 個的方案數,如果 \(n - a + i\) 被欽定,可取的位置有 \(i\) 種,有 \(j - 1\) 個已經被用過。

根據 \(n - a + i\) 要不要欽定從 \(f(i - 1)\) 轉移:\(f(i, j) = f(i - 1, j) + f(i - 1, j - 1) \times (i - j + 1)\)

時間複雜度 \(O(a^2 + Ta\log n)\)submission

C

題意:\(n\) 個城市,\(m\) 條單向鐵路。\(i\) 號鐵路依次經過 \(v_{i, 1}, v_{i, 2}, \cdots, v_{i, s_i}\),其中 \(v_{i, j} \to v_{i, j + 1}\) 的鐵路長度是 \(t_{i, j}\)

每條鐵路可以在任意站上/下車。求一條 \(1\sim n\) 的最短路,並使相鄰兩個換乘點距離的平方和最大。

D