9.8 模擬賽(煉石計劃 11 月 11日 CSP-S 十連測 #9)

2huk發表於2024-09-08

煉石計劃 11 月 11 日 CSP-S 十連測 #9【補題】 - 比賽 - 夢熊聯盟 (mna.wang)

\(100+60+20+15 = 195\)

覆盤

順序開題。T1 是二分板子。寫之前思考好了所有程式碼細節直接寫程式碼。一遍過了所有大樣例。

T2。題意好麻煩。

\(35\) 分是極易的。跳過 \(25\) 分部分分,直接想正解。

有三個變數 \(a, b, c\) 肯定要列舉一個。那當然是先嚐試列舉 \(a\)。此時 \(N_1 = N_0 \bmod a = (N^2 + 1) \bmod a\) 確定了,剩下的就比較好做。

中間嘗試推了很長時間的式子,都是基於同餘的,不知道怎麼推到歪成那樣的。數學式子變形還要多練。

剩下的是 \((N_1+b) \bmod c = N_3\)。感覺正解不太好做,先嚐試 \(35+25=60\) 分吧。

最終化簡到了一個形如 \((b + c) \bmod c = k\) 的形式。發現暴力列舉的複雜度是調和級數。直接寫!

最終大樣例都過了。手造資料 1 1 2000 跑了三秒多,不太妙。將 std::sort 改成桶拍後僅 0.1 秒。放心了。

T3 田忌賽馬。我不是孫臏所以我不會。寫了階乘的 \(20\) 分就跑路了。

T4 神迷題。變數很多。順好題意後發現 我 連 \(n = 2\) 的 15 分 都 不 會。

大悲。我不想在 T4 爆零。於是騙分啟動。

最初嘗試輸出 \(\min a_i\),但是小資料正確性極低大資料正確性為 \(0\)。遂放棄。

腦中突然閃過一個想法:我可以強制讓同一棵珠子每次都減小相同的高度。感覺 \(n = 2\) 的正確機率挺大(我也不知道為什麼,只是感覺)。然後就寫了。

手造了兩組 \(n = 2\) 的樣例都正確。我發現這個騙分策略可以不僅侷限於 \(n \le 2\)。具體的我寫了個 dfs,思路與上面相同,過了 \(n = 3\) 的樣例 1。

雖然我只給它測了三組資料,但是我猜測這個程式能拿不少分。至少 \(n = 1\) 的能過吧。

然後寫了 T1 + T2 60 的對拍。

賽後發現 T4 的 \(n \le 2\) 全過了,其餘的全 T 了。原因是 dfs 複雜度不對。喜+悲。

所以應該是一分沒掛???

做的好的及不足

  • 沒有在 T1 的二分細節上浪費時間。

  • T4 猜結論猜中了(雖然這樣做一定是錯誤的但是有分)。

  • T2 推式子時因為正負號錯了浪費了很長時間。

知識點

T1:二分。

T2:數學。

題解

T1. 查詢

如果沒有重複,那麼 \(x\) 是序列中的第 \(k\) 小,等價於序列中存在恰好 \(k - 1\) 個數 \(< x\)

有重複後,如果 \(x\) 是序列中的第 \(k\) 小,那麼序列中 \(< x\) 的數的數量應 \(< k\),且 \(x\) 最大。於是可以二分。

問題轉化成求有多少 \((i, j)\) 滿足 \(a_j + b_jc_i < mid\)

列舉 \(j\)。那麼 \(c_i < \lceil \frac{mid-a_j}{b_j} \rceil\)。二分即可。

T2. 列舉

\(N\) 沒用。可以一步直接求 \(N_0 = N^2 + 1\)。此時:

\[N_1 = N_0 \bmod a \\ N_2 = N_1 + b \\ N_3 = N_2 \bmod c \]

注意到當 \(N_3\) 確定時,滿足條件的對 \((N_2, c)\) 的數量是調和級數。我們將這些對預處理。

考慮計算答案。列舉 \(a\),這樣就能求出 \(N_1\)

根據條件二,不難發現如果確定了 \(N_1, N_2\),那麼 \(b\) 是唯一確定的。如果 \(b\) 存在則需要滿足 \(0 \le N_2 - N_1 \le P\)

所以我們可以在預處理的 \((N_2, c)\) 對序列裡二分。

看程式碼理解更好:提交記錄 #607099 - 夢熊聯盟 (mna.wang)

相關文章