寫在前面的話
想了一個小時,第一次寫這種題,也算是學到了。可惜這個題本來不難的,沒有寫出來。但是覺得特別好,於是記下,希望對我和大家都有幫助!
題意
給你兩個不等式:
給出 \(x , n\) 要求出符合不等式組的三元組\((a , b, c)\) , 其中$(1 , 2 , 1) , (1 , 1 , 2) $不被認為是同一組解。
約束: 對於T組測試點滿足 , \(1 \leq \sum_{i=1}^{T}x_i , \sum_{i=1}^{T}n_i \leq 10 ^ 6\)
思路
觀察不等式 , 我們可以發現因為\(a \ast c + a \ast b + b \ast c\)這種特殊結構 , 所以\((1 , 2 , 1), (1 , 1 , 2)\) 結果相同 , 它們等價。
觀察資料範圍 ,\(10 ^ 6\) 大機率是 \(O(n)\) 到 \(O(nlogn)\) 的做法合理.
觀察到 \(3 \leq a + b + c \leq x\) 這也是一個性質 , 但是貌似和解題沒什麼關係。
觀察到 , 如果\(a \ast b + a \ast c + b \ast c \leq n\) 成立 ,那麼 \(a \ast b \leq n\) 也一定成立。假設我們現在列舉 a , 然後看看最多有多少合法的 b。
結論:
- 對於\(\forall a\) 最多有 \(O(logn)\) b 成立
那麼我們只需要暴力列舉 a , b 即可 , 如果發現不等式不滿足 ,直接放棄更大b的列舉。——因為兩個不等式左邊是單調的。
將不等式變形 , 所以答案是
因為C 最小取 1 , 我們只需要找到滿足兩個等式的C最大取多少。將所有的\(a , b\) 都列舉完 , 統計貢獻即可。
時間複雜度證明
首先我們試著找到 b 最多列舉多少個 , 由上 \(a \ast b \leq n\)
我們知道 b 最多列舉 這麼多 , 但是這不夠顯然!
我們可以嘗試先暴力 , 列舉 a , b.
那麼我們可以得到答案為以下等式:
Note: 為了保證取到最多的b使得上式儘量成立 , 我們取 \(C := C_{min}\) 即 1。
我們可以透過放縮得到下式:
對於右邊的等式我們發現是一個調和級數 對於\(\forall a\), 我們最多可以取到\(O(logn)\)個b , 所以最後的時間複雜度是
\(O(nlogn)\)的。
至此,證畢!
後文
如有任何錯誤和建議,請在評論區指出!