題解-ARC117


ARC117


ARC117A God Sequence

\(A, A - 1, ... 1, -1, -2, ... -B\)。減少最小值或增加最大值控制總和。 aclink(0)


ARC117B ARC Wrecker

除了不同的數會變得相同,其他相對大小不會改變。

所以設高度取值(包括最低點 \(0\))排序后的集合為 \(a\),那么可以獨立選擇把每個間距(\(a_{i + 1} - a_i\))減到多少,所以答案就是 \(\prod (a_{i + 1} - a_i + 1)\)

aclink(0)


ARC117C Tricolor Pyramid

必然要轉化運算 \(\to a \otimes b = -(a + b)\bmod 3\)

然后組合數算貢獻即可。然后這里還有個小問題(我搞了約 \(30\) 分鍾),就是處理階乘時如果 \(n \ge 3\),就會 \(n! \equiv 0\pmod 3\)。所以維護一個數的同時維護它當中因數 \(3\) 的個數。

aclink(0)


ARC117D Miracle Tree

無根樹必須找根。必然有一個點 \(u\) 滿足 \(E_u = 1\),就設它為根。

然后對於兩條葉子到根的鏈,它們受到根的距離的約束必然沒有互相之間距離的約束大,但是又不足以大到要把 \(E_u\) 跟深度反着標。所以標法必然是維護一個時間,DFS 整棵樹,在一個節點進棧的時候時間 \(+1\),出棧的時候時間 \(+1\),然后一個節點的 \(E_u\) 為進棧時間。

然后會發現最大的標號的節點(終止節點) \(v\) 的標號是 \(2n - dep[v]\)。所以根和終止節點取直徑的兩端即可。

aclink(0)


ARC117E Zero-Sum Ranges 2

沒有毒瘤,比 AtCoder,更喜歡,出線頭 dp。

很明顯轉前綴和。相當於長度為 \(2n + 1\) 的序列 \(s_i\)\(s_0 = s_{2n} = 0\)\(|s_{i + 1} - s_i| = 1\)。一個區間 \([l, r)\) 和為 \(0\) 當且僅當 \(s_l = s_r\)

必然要 dp。然后由於對於 \(x\) 如果有 \(d\)\(s_i = x\),就有 \(\frac{d(d - 1)}{2}\) 個和為 \(0\) 的區間,所以考慮一層一層來 dp。又因為后若干層組成的若干個不連通的峰和當前的絕對位置沒有關系,所以考慮到線頭 dp(這種 AtCoder 風格的毒瘤 dp 我自己是永遠想不到的啊)。

\(f[i][j][k]\) 表示當前前綴高度(具體是多少不重要)有 \(i\) 個點,\(j\) 個和為 \(0\) 的區間,\(k\) 個不連通的峰。轉移比較簡單,枚舉 \(i, j, k, d\),表示新一層有 \(d\) 個點,然后用組合數隔板法把 \(d\) 個點分成 \(k + 1\) 份即可。偷個 AtCoder 官方題解圖:

最后枚舉 \(0\) 線及以上的峰和 \(0\) 線以下的峰合並統計答案即可。時間復雜度 \(\Theta(n ^ 5)\)

aclink(*0)


ARC117F Gateau

容易想到搞成前綴和然后差分約束。但是由於題目是個環差分約束很麻煩,所以一個比較好的辦法是二分答案 \(s_{2n}\),這樣對於 \(i \ge n\) 的條件 \(\ge a_i\) 就轉化為了 \(s_i - s_{i - n} \le s_{2n} - a_i\)

如果直接跑最短路解決差分約束直接 TLE,所以考慮到(其實我也不知道該考慮到什么才能想到這個鬼東西,太玄學了)所有條件都是對於長度為 \(n\) 的區間的,可以想辦法搞出 \(s_n\)

假如 \(s_n\) 已定,可以貪心求出 \(s[1, n)\)\(s[n + 1, 2n)\)(先令 \(s_i = s_{i - 1}\)\(s_{i + n} = s_{i - 1 + n}\),然后如果 \(s_{i + n} - s_i > s_{2n} - a_{i + n}\) 就增加 \(s_i\),如果 \(s_{i + n} - s_i < a_{i}\) 就增加 \(s_{i + n}\),這樣的調整能保證 \(s\) 單調不減),如果 \(s_{n - 1} \le s_n\)\(s_{2n - 1} \le s_{2n}\),那么就得到了一個合法的序列 \(s\) 了。

如果 \(s_n\) 太小,\(s_{n - 1} \le s_n\) 很難解決,如果 \(s_n\) 太大,\(s_{2n - 1} \le s_{2n}\) 很難解決(很明顯貪心求出的 \(s_{2n - 1}\)\(s_n\) 是單調的)。由於兩個條件是相互獨立且相互抵抗的,所以可以考慮二分滿足第一個條件的最小 \(s_n\) 或滿足第二個條件的最大 \(s_n\) 然后看看滿不滿足另一個條件。如果不滿足,那么這個 \(s_{2n}\) 就不滿足條件。

別忘了貪心求出的 \(s_{n - 1}\)\(s_{2n - 1}\) 是會爆 int 的,而且別忘了 \(a_0\)\(a_n\) 的限制(用於規定 \(s_n\) 的二分邊界)。時間復雜度 \(\Theta(n\log ^ 2 n)\)

aclink(*2)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM